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

Nancy ·
更新时间:2024-11-14
· 756 次阅读

本文为大家分享了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端文件同步

您可能感兴趣的文章:基于Java回顾之多线程同步的使用详解解析Java线程同步锁的选择方法Android使用OkHttp进行网络同步异步操作



文件同步 Android

需要 登录 后方可回复, 如果你还没有账号请 注册新账号