当前位置:主页 > 移动开发 > Android代码 >

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

时间:2020-10-10 11:46:43 | 栏目:Android代码 | 点击:

本文为大家分享了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<FileOptions> 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<String> fileName, ArrayList<String> 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<FileOptions>();
      File rootPath= new File(Environment.getExternalStorageDirectory().getPath()+ FILE_PATH);
      File[] files = rootPath.listFiles(); // 列出所有文件
      for( int i=0;i<files. length;i++){
         if(files[i].isFile()){
           FileOptions fp= new FileOptions();
           fp. name=files[i].getName();
           fp. path=files[i].getPath();
           fp. size=files[i].length();
           fileList.add(fp);
        }
      }
   }
}

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;i<jsonSize;i++){
         SOCKET nameSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
          int ret = connect(nameSocket,( struct sockaddr*)&ServerAddr, sizeof (ServerAddr));
          if ( ret == SOCKET_ERROR ){
            AfxMessageBox(_T( "connect 失败 "));
         } else {
         }
         FILE *fp;
          int tempCount=0;
         fileStr flst=fileList.GetAt(fileList.FindIndex(i));
         fopen_s(&fp,flst.name.c_str(), "wb+" );
         
         pProgressDlg->setFile(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端文件同步

您可能感兴趣的文章:

相关文章