栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android和PC端通过局域网文件同步

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android和PC端通过局域网文件同步

本文为大家分享了Android和PC端通过局域网文件同步的具体代码,供大家参考,具体内容如下

public class FileOptions {
   public String name;
   public String path;
   public long size;
}
 
//Activity
public class MainActivity extends Activity {
   private TextView tvMsg;
   private EditText logShow, filePath;
   private Handler handler;
   private SocketManager socketManager;
   
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout. activity_main);
      
      tvMsg = (TextView)findViewById(R.id. tvMsg);
      logShow = (EditText)findViewById(R.id. log_show);
      handler = new Handler(){
  @Override
  public void handleMessage(Message msg) {
    switch(msg. what){
    case 0:
SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss" );
logShow.append( "n[" + format.format(new Date()) + "]" + msg.obj .toString());
break;
    case 1:
tvMsg.setText( "请在PC端输入IP:" + GetIpAddress() + " 端口:" + msg.obj .toString());
break;
    case 2:
      Toast. makeText(getApplicationContext(), msg.obj.toString(), Toast. LENGTH_SHORT).show();
break;
    }
 }
      };
      socketManager = new SocketManager( handler);
   }
   @Override
   protected void onDestroy() {
      super.onDestroy();
      System. exit(0);
   }
   public String GetIpAddress() {  
     WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE );  
     WifiInfo wifiInfo = wifiManager.getConnectionInfo();  
     int i = wifiInfo.getIpAddress();
     return (i & 0xFF) + "." +  
((i >> 8 ) & 0xFF) + "." +  
((i >> 16 ) & 0xFF)+ "." +  
 ((i >> 24 ) & 0xFF );  
   }  
}
 
//socket管理
public class SocketManager {
   private static final String FILE_PATH= "/glass";
   private static final String TAG = "SocketManager";
   private ServerSocket server;
   private Handler handler = null;
   private List fileList;
 
   public SocketManager(Handler handler) {
      this. handler = handler;
      int port = 9999;
      while (port > 9000) {
  try {
    server = new ServerSocket(port);
    break;
 } catch (Exception e) {
    port--;
 }
      }
      SendMessage(1, port);
      Thread receiveFileThread = new Thread( new Runnable() {
  @Override
  public void run() {
    while ( true) { // 接收文件
ReceiveFile();
    }
 }
      });
      receiveFileThread.start();
   }
 
   void SendMessage( int what, Object obj) {
      if ( handler != null) {
 Message. obtain( handler, what, obj).sendToTarget();
      }
   }
 
   // 接收文件
   void ReceiveFile() {
      Socket socketPC= null;
      try {
 GetAllFiles();
 socketPC = server.accept();
 InetAddress netAddr = socketPC.getInetAddress();
 String ipaddr = netAddr.getHostAddress();
 Log. w( TAG, ipaddr);
 OutputStream outputStream = socketPC.getOutputStream();
 JSonArray jsonArr= new JSonArray();
  for( int i=0;i< fileList.size();i++){
    try {
JSonObject jsonObj= new JSonObject();
jsonObj.put( "name", fileList.get(i). name);
jsonObj.put( "path", fileList.get(i). path);
jsonObj.put( "size", fileList.get(i). size);
jsonArr.put(jsonObj);
    } catch (JSonException e) {
// TODO Auto-generated catch block
e.printStackTrace();
    }
 }
 
 String sendStr=jsonArr.toString();
  byte[] sendBuf=sendStr.getBytes( "GB2312");
 outputStream.write(sendBuf, 0, sendBuf. length);
 outputStream.flush();
 SendMessage(0, " 发送文件索引完成" );
 outputStream.close();
 socketPC.close();
 
  for( int i=0;i< fileList.size();i++){
    Socket fileSendSocket = server.accept();
    File fsend= new File( fileList.get(i). path);
    FileInputStream fis= new FileInputStream(fsend);
    OutputStream fos = fileSendSocket.getOutputStream();
    byte[] buf = new byte[1024];
    while ( true) { 
    int read = 0; 
    if (fis != null) { 
      read = fis.read(buf); 
    } 
    if (read == -1) { 
      break; 
    } 
    fos.write(buf,0,read); 
  }
    fos.flush();
    SendMessage(0, fileList.get(i). name+ "--文件传输完成" );
    fis.close();
    fos.close();
    fileSendSocket.close();
 }
 
      } catch (IOException e) {
  // TODO Auto-generated catch block
 e.printStackTrace();
      }
   }
 
   public void SendFile(ArrayList fileName, ArrayList path,
 String ipAddress, int port) {
      try {
  for ( int i = 0; i < fileName.size(); i++) {
    Socket name = new Socket(ipAddress, port);
    OutputStream outputName = name.getOutputStream();
    OutputStreamWriter outputWriter = new OutputStreamWriter(
  outputName);
    BufferedWriter bwName = new BufferedWriter(outputWriter);
    bwName.write(fileName.get(i));
    bwName.close();
    outputWriter.close();
    outputName.close();
    name.close();
    SendMessage(0, "正在发送" + fileName.get(i));
 
    Socket data = new Socket(ipAddress, port);
    OutputStream outputData = data.getOutputStream();
    FileInputStream fileInput = new FileInputStream(path.get(i));
    int size = -1;
    byte[] buffer = new byte[1024];
    while ((size = fileInput.read(buffer, 0, 1024)) != -1) {
outputData.write(buffer, 0, size);
    }
    outputData.close();
    fileInput.close();
    data.close();
    SendMessage(0, fileName.get(i) + " 发送完成" );
 }
 SendMessage(0, "所有文件发送完成" );
      } catch (Exception e) {
 SendMessage(0, "发送错误:n" + e.getMessage());
      }
   }
   //待优化
   private void GetAllFiles(){
      fileList= new ArrayList();
      File rootPath= new File(Environment.getExternalStorageDirectory().getPath()+ FILE_PATH);
      File[] files = rootPath.listFiles(); // 列出所有文件
      for( int i=0;i

PC端用VS2005写的。用了Json格式数据进行数据通信。主要用法为:在同一局域网内,打开PC端和Android端程序,按照Android端提示的IP地址及端口在PC端程序编辑框中正确输入,点击链接,即可将sd卡根目录下的相关文件夹下的文件同步到PC端。

//PC端主要源码
//数据传输线程
DWORD WINAPI RecvThread(LPVOID lpParameter)
{
   SOCKET recvSocket = (SOCKET)lpParameter;
    int ret = 0,strLen=0;
    char recvBuffer[MAX_LEN],*pRecvAllData;
   Json::Reader reader;
   Json::Value jsonArr;
   
    while ( true )
   {

      pRecvAllData=( char *)malloc(MAX_LEN);
while ((ret = recv(recvSocket, recvBuffer, MAX_LEN, 0))>0){
  strLen+=ret;
  pRecvAllData=( char *)realloc(pRecvAllData,strLen);
  memcpy(pRecvAllData+strLen-ret,recvBuffer,ret);
      };
      
if (!reader.parse(pRecvAllData, jsonArr)){
  Sleep(1000);
   continue ;
      }
int jsonSize = jsonArr.size();
      CString strItem;
      fileList.RemoveAll();
for (int j = 0; j < jsonSize; ++j) 
      { 
  std::string name = jsonArr[j][ "name" ].asString();
  std::string path = jsonArr[j][ "path" ].asString();
   int size = jsonArr[j][ "size" ].asInt();
  strItem.Format(TEXT( "%d" ), j+1);
  pFileRecvDlg->m_fileListCtrl.InsertItem(j,strItem.GetBuffer(0));
  pFileRecvDlg->m_fileListCtrl.SetItemText(j,0,strItem.GetBuffer(0));
  strItem=name.c_str();
  fileStr filest;
  filest.name=name;
  filest.size=size;
  fileList.AddTail(filest);
  pFileRecvDlg->m_fileListCtrl.SetItemText(j,1,strItem.GetBuffer(0));
      }
      free(pRecvAllData);
      closesocket(recvSocket);
 
      CRect rect;
      pFileRecvDlg->GetClientRect(&rect);
      pFileRecvDlg->ClientToScreen(rect);
if (!pProgressDlg->IsWindowVisible()){
  pProgressDlg->ShowWindow(SW_SHOW);
      }
      pProgressDlg->SetWindowPos(NULL,rect.left+100,rect.top+100,0,0,SWP_NOSIZE);
      pFileRecvDlg->GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(FALSE);
// 发送文件名
for (int i=0;isetFile(flst.name,flst.size);
   while ((ret = recv(nameSocket, recvBuffer, MAX_LEN, 0))!=0){
     fwrite(recvBuffer, sizeof (char ),ret,fp);
     tempCount+=ret;
     pProgressDlg->updateProgress(tempCount);
  }
  _fcloseall( );
  closesocket(nameSocket);
      }
      pFileRecvDlg->GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(TRUE);
      pProgressDlg->ShowWindow(SW_HIDE);
   }
    return 0;
}
//连接按钮的响应函数
void CGlassFileRecvDlg::onBnClickedButtonConnect()
{
    // TODO: 在此添加控件通知处理程序代码
    if (UpdateData()){
      BYTE nField0,nField1,nField2,nField3;
      m_IpAddrCtrl.GetAddress(nField0,nField1,nField2,nField3);
      WSADATA Ws;
      SOCKET CientSocket;
int Ret = 0;
int AddrLen = 0;
      HANDLE hThread = NULL;
char SendBuffer[MAX_PATH];
 
//Init Windows Socket
if ( WSAStartup(MAKEWORd(2,2), &Ws) != 0 )
      {
   return ;
      }
//Create Socket
      CientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if ( CientSocket == INVALID_SOCKET )
      {
  MessageBox(_T( "socket 创建失败 " ));
   return ;
      }
 
char strAddr[50],tempStr[10];
      memset(strAddr,0, sizeof (strAddr));
      memset(tempStr,0, sizeof (tempStr));
      itoa(nField0,tempStr,10);
      strcat(strAddr,tempStr);
      strcat(strAddr, "." );
      itoa(nField1,tempStr,10);
      strcat(strAddr,tempStr);
      strcat(strAddr, "." );
      itoa(nField2,tempStr,10);
      strcat(strAddr,tempStr);
      strcat(strAddr, "." );
      itoa(nField3,tempStr,10);
      strcat(strAddr,tempStr);
 
      ServerAddr.sin_family = AF_INET;
      ServerAddr.sin_addr.s_addr = inet_addr(strAddr);
      ServerAddr.sin_port = htons(m_port);
      memset(ServerAddr.sin_zero, 0x00, 8);
 
      Ret = connect(CientSocket,( struct sockaddr*)&ServerAddr, sizeof (ServerAddr));
if ( Ret == SOCKET_ERROR ){
  MessageBox(_T( "connect 失败 "));
   return ;
      } else {
  HANDLE hThread = CreateThread(NULL, 0, RecvThread, (LPVOID)CientSocket, 0, NULL);
   if ( hThread == NULL ){
     MessageBox(_T( " 创建线程失败 "));
      return ;
  }
  CloseHandle(hThread);
      }
   }
}

源码下载地址为:android端与PC端文件同步

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/155822.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号