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 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 fileName, ArrayList 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();
File
rootPath=
new
File(Environment.getExternalStorageDirectory().getPath()+ FILE_PATH);
File[] files = rootPath.listFiles(); // 列出所有文件
for( int i=0;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);
};
温馨提示:当前文档最多只能预览 4 页,此文档共9 页,请下载原文档以浏览全部内容。如果当前文档预览出现乱码或未能正常浏览,请先下载原文档进行浏览。



1 / 4 9
下载提示
1 该文档不包含其他附件(如表格、图纸),本站只保证下载后内容跟在线阅读一样,不确保内容完整性,请务必认真阅读
2 除PDF格式下载后需转换成word才能编辑,其他下载后均可以随意编辑修改
3 有的标题标有”最新”、多篇,实质内容并不相符,下载内容以在线阅读为准,请认真阅读全文再下载
4 该文档为会员上传,版权归上传者负责解释,如若侵犯你的隐私或权利,请联系客服投诉