Android和PC端通过局域网文件同步
本文为大家分享了Android和PC端通过局域网文件同步的具体代码,供大家参考,具体内容如下
publicclassFileOptions{ publicStringname; publicStringpath; publiclongsize; } //Activity publicclassMainActivityextendsActivity{ privateTextViewtvMsg; privateEditTextlogShow,filePath; privateHandlerhandler; privateSocketManagersocketManager; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvMsg=(TextView)findViewById(R.id.tvMsg); logShow=(EditText)findViewById(R.id.log_show); handler=newHandler(){ @Override publicvoidhandleMessage(Messagemsg){ switch(msg.what){ case0: SimpleDateFormatformat=newSimpleDateFormat("hh:mm:ss"); logShow.append("\n["+format.format(newDate())+"]"+msg.obj.toString()); break; case1: tvMsg.setText("请在PC端输入IP:"+GetIpAddress()+"端口:"+msg.obj.toString()); break; case2: Toast.makeText(getApplicationContext(),msg.obj.toString(),Toast.LENGTH_SHORT).show(); break; } } }; socketManager=newSocketManager(handler); } @Override protectedvoidonDestroy(){ super.onDestroy(); System.exit(0); } publicStringGetIpAddress(){ WifiManagerwifiManager=(WifiManager)getSystemService(WIFI_SERVICE); WifiInfowifiInfo=wifiManager.getConnectionInfo(); inti=wifiInfo.getIpAddress(); return(i&0xFF)+"."+ ((i>>8)&0xFF)+"."+ ((i>>16)&0xFF)+"."+ ((i>>24)&0xFF); } } //socket管理 publicclassSocketManager{ privatestaticfinalStringFILE_PATH="/glass"; privatestaticfinalStringTAG="SocketManager"; privateServerSocketserver; privateHandlerhandler=null; privateListfileList; publicSocketManager(Handlerhandler){ this.handler=handler; intport=9999; while(port>9000){ try{ server=newServerSocket(port); break; }catch(Exceptione){ port--; } } SendMessage(1,port); ThreadreceiveFileThread=newThread(newRunnable(){ @Override publicvoidrun(){ while(true){//接收文件 ReceiveFile(); } } }); receiveFileThread.start(); } voidSendMessage(intwhat,Objectobj){ if(handler!=null){ Message.obtain(handler,what,obj).sendToTarget(); } } //接收文件 voidReceiveFile(){ SocketsocketPC=null; try{ GetAllFiles(); socketPC=server.accept(); InetAddressnetAddr=socketPC.getInetAddress(); Stringipaddr=netAddr.getHostAddress(); Log.w(TAG,ipaddr); OutputStreamoutputStream=socketPC.getOutputStream(); JSONArrayjsonArr=newJSONArray(); for(inti=0;i fileName,ArrayList path, StringipAddress,intport){ try{ for(inti=0;i (); FilerootPath=newFile(Environment.getExternalStorageDirectory().getPath()+FILE_PATH); File[]files=rootPath.listFiles();//列出所有文件 for(inti=0;i PC端用VS2005写的。用了Json格式数据进行数据通信。主要用法为:在同一局域网内,打开PC端和Android端程序,按照Android端提示的IP地址及端口在PC端程序编辑框中正确输入,点击链接,即可将sd卡根目录下的相关文件夹下的文件同步到PC端。
//PC端主要源码 //数据传输线程 DWORDWINAPIRecvThread(LPVOIDlpParameter) { SOCKETrecvSocket=(SOCKET)lpParameter; intret=0,strLen=0; charrecvBuffer[MAX_LEN],*pRecvAllData; Json::Readerreader; Json::ValuejsonArr; 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; } intjsonSize=jsonArr.size(); CStringstrItem; fileList.RemoveAll(); for(intj=0;jm_fileListCtrl.InsertItem(j,strItem.GetBuffer(0)); pFileRecvDlg->m_fileListCtrl.SetItemText(j,0,strItem.GetBuffer(0)); strItem=name.c_str(); fileStrfilest; filest.name=name; filest.size=size; fileList.AddTail(filest); pFileRecvDlg->m_fileListCtrl.SetItemText(j,1,strItem.GetBuffer(0)); } free(pRecvAllData); closesocket(recvSocket); CRectrect; 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(inti=0;i 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); } return0; } //连接按钮的响应函数 voidCGlassFileRecvDlg::OnBnClickedButtonConnect() { //TODO:在此添加控件通知处理程序代码 if(UpdateData()){ BYTEnField0,nField1,nField2,nField3; m_IpAddrCtrl.GetAddress(nField0,nField1,nField2,nField3); WSADATAWs; SOCKETCientSocket; intRet=0; intAddrLen=0; HANDLEhThread=NULL; charSendBuffer[MAX_PATH]; //InitWindowsSocket if(WSAStartup(MAKEWORD(2,2),&Ws)!=0) { return; } //CreateSocket CientSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(CientSocket==INVALID_SOCKET) { MessageBox(_T("socket创建失败")); return; } charstrAddr[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,(structsockaddr*)&ServerAddr,sizeof(ServerAddr)); if(Ret==SOCKET_ERROR){ MessageBox(_T("connect失败")); return; }else{ HANDLEhThread=CreateThread(NULL,0,RecvThread,(LPVOID)CientSocket,0,NULL); if(hThread==NULL){ MessageBox(_T("创建线程失败")); return; } CloseHandle(hThread); } } } 源码下载地址为:android端与PC端文件同步
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。