首页 > 系统 > Android > 正文

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

2019-10-21 21:46:18
字体:
来源:转载
供稿:网友

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

public class FileOptions {   public String name;   public String path;   public long size;} //Activitypublic 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端文件同步

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


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表