我是靠谱客的博主 跳跃丝袜,这篇文章主要介绍Android和PC端通过局域网文件同步,现在分享给大家,希望可以做个参考。

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
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端。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
//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端文件同步

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

最后

以上就是跳跃丝袜最近收集整理的关于Android和PC端通过局域网文件同步的全部内容,更多相关Android和PC端通过局域网文件同步内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(110)

评论列表共有 0 条评论

立即
投稿
返回
顶部