Android和PC端通過(guò)局域網(wǎng)文件同步
本文為大家分享了Android和PC端通過(guò)局域網(wǎng)文件同步的具體代碼,供大家參考,具體內(nèi)容如下
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( "請(qǐng)?jiān)赑C端輸入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, " 發(fā)送文件索引完成" ); 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, "正在發(fā)送" + 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) + " 發(fā)送完成" ); } SendMessage(0, "所有文件發(fā)送完成" ); } catch (Exception e) { SendMessage(0, "發(fā)送錯(cuò)誤:\n" + e.getMessage()); } } //待優(yōu)化 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寫(xiě)的。用了Json格式數(shù)據(jù)進(jìn)行數(shù)據(jù)通信。主要用法為:在同一局域網(wǎng)內(nèi),打開(kāi)PC端和Android端程序,按照Android端提示的IP地址及端口在PC端程序編輯框中正確輸入,點(diǎn)擊鏈接,即可將sd卡根目錄下的相關(guān)文件夾下的文件同步到PC端。
//PC端主要源碼 //數(shù)據(jù)傳輸線程 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); // 發(fā)送文件名 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; } //連接按鈕的響應(yīng)函數(shù) 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 創(chuàng)建失敗 " )); 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( " 創(chuàng)建線程失敗 ")); return ; } CloseHandle(hThread); } } }
源碼下載地址為:android端與PC端文件同步
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android HttpURLConnection下載網(wǎng)絡(luò)圖片設(shè)置系統(tǒng)壁紙
這篇文章主要為大家詳細(xì)介紹了Android HttpURLConnection下載網(wǎng)絡(luò)圖片設(shè)置系統(tǒng)壁紙,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10Android sd卡讀取數(shù)據(jù)庫(kù)實(shí)例代碼
這篇文章主要介紹了Android sd卡讀取數(shù)據(jù)庫(kù)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02Android實(shí)現(xiàn)仿iOS菊花加載圈動(dòng)畫(huà)效果
iOS上有一個(gè)UIActivityIndicator的控件,就是俗稱轉(zhuǎn)菊花的控件,一般UI設(shè)計(jì)師會(huì)按照iOS的風(fēng)格來(lái)出設(shè)計(jì)稿,也要求使用這種Loading效果,本文將具體的講述如何實(shí)現(xiàn)這種效果,感興趣的朋友可以參考下2021-05-05Android RecyclerView 滾動(dòng)到中間位置的方法示例
這篇文章主要介紹了Android RecyclerView 滾動(dòng)到中間位置的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03Android實(shí)現(xiàn)網(wǎng)易云音樂(lè)高仿版流程
這篇文章主要介紹了Android實(shí)現(xiàn)網(wǎng)易云音樂(lè)高仿版,包含了首頁(yè)復(fù)雜發(fā)現(xiàn)界面布局和功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08Android開(kāi)發(fā):微信授權(quán)登錄與微信分享完全解析
本篇文章主要介紹了Android微信授權(quán)登錄與微信分享,具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11Android中Textview超鏈接實(shí)現(xiàn)方式
TextView中的超鏈接可以通過(guò)幾種方式實(shí)現(xiàn):1.Html.fromHtml,2.Spannable,3.Linkify.addLinks。下面分別進(jìn)行測(cè)試,包括修改字體樣式,下劃線樣式,點(diǎn)擊事件等,需要的朋友可以參考下2016-02-02Android關(guān)于WebView中無(wú)法定位的問(wèn)題解決
本篇文章主要介紹了Android關(guān)于WebView中無(wú)法定位的問(wèn)題解決,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10