Socket实现文件传输(二)
上次说了用Socket实现文件传输的前提工作,获取手机的各种资源文件,这篇就主要讲一下具体的实现过程,传输原理是基于Socket实现的。
实现文件传输
在拿到各种文件资源后(关于获取手机资源文件请参照我的上一篇博客获取手机文件资源),我们可以传输文件到电脑了,在传输文件之前先要连接设备,也就是在客户端连接到一台pc,Socket连接客户端和服务端必须在线程里面执行,
在点击连接设备后,启动新线程,执行Socket连接工作,在连接的时候有几点需要注意的,
1. 客户端和pc端必须在同一个局域网下;
2. 在连接时pc端需要关闭防火墙,不过我试过有时候不关也可以,但是最好还是关闭;
3. 在连接完成后Socket和流都要close掉,否则数据传不过去;代码如下:
package com.example.manager.Thread;
import android.util.Log;
import com.example.manager.Fragment.ConnectFragment;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.net.Socket;
/**
* Created by Dangelo on 2016/5/20.
*/
public class SocketThread implements Runnable {
private Socket socket;
private String IP;
private int port;
public SocketThread(Socket socket, String IP, int port){
this.socket = socket;
this.IP = IP;
this.port = port;
}
@Override
public void run() {
try {
socket = new Socket(IP, port);
ConnectFragment.connectHandler.sendEmptyMessage(0x000);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.close();
socket.close();
} catch (Exception e) {
Log.e("Socket Error", e.toString());
ConnectFragment.connectHandler.sendEmptyMessage(0x111);
}
}
}
到这客户端连接pc的工作基本上就完成了。接下来就是服务端的任务了。启动服务端,在接收到客户端的请求之后连接到客户端,这下就能够传文件到pc了,在做这个项目的时候我在传文件的基础上还附加了一些传输命令功能,可以在客户端直接控制pc执行一些操作,像常用的电源,音量,亮度,鼠标控制等等,这些操作方便了对pc的控制。
在传输文件和命令时需要区分它们的类别,我用的是Json数据来处理的,如果接收到的是command就执行命令操作,再根据后续的具体命令去执行具体的操作,如果是file就执行传文件操作。这样在处理数据的时候就很容易了,启动后连接成功拿到当前传过来的字符串,先判断是传输文件还是传输命令,如果有“command”键就执行命令操作,并且拿到当前的命令类型,执行对应操作,代码如下:
static ServerSocket ss = null;
public void run() {
try {
ss = new ServerSocket(30000);
System.out.println("服务端创建成功!");
while(true) {
Socket socket = ss.accept();
System.out.println("客户端连接成功!");
System.out.println(socket.getLocalSocketAddress());
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
StringBuilder str = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
str.append(line);
}
if(str.toString().equals("")){
continue;
}
JSONObject jsonObject = new JSONObject(str.toString());
if(jsonObject.has("command")) { //传输命令
switch (jsonObject