Socket作为应用网络交互的一种方式,可以称作为套接字。应用通常通过套接字来向网络发出请求或者应答请求。下面实现一个Socket基于TCP协议传输文件的交互应用。主要方法都在子线程中实现。
这是Socket服务端,也就是作为接收端。
class ServerThread extends Thread{
@Override
public void run() {
ServerSocket serverSocket=null;
try {
//创建一个ServerSocket对象,并在4567端口监听
serverSocket=new ServerSocket(4567);
//调用ServerSocket的accept的方法,阻塞接收客户端请求
Socket socket=serverSocket.accept();
InputStream inputStream=socket.getInputStream();
//实例化文件输出流的位置和文件名和位置
FileOutputStream out = new FileOutputStream(Environment.getExternalStorageDirectory()+"/aa.jpg");
byte buffer[]=new byte[1024*4];
int temp=0;
//从InputStream中读取接收的数据
while((temp=inputStream.read(buffer))!=-1){
//通过输出流将文件生成
out.write(buffer,0,temp);
out.flush();
}
inputStream.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
super.run();
}
}
下面是作为Socket端,也就是发送信息的客户端。
class ServerThread extends Thread{
@Override
public void run() {
try {
//创建一个Socket对象,指定服务器端的IP和端口
Socket socket=new Socket("192.168.31.185",4567);
//使用InputStream读取内存文件
InputStream inputStream=new FileInputStream(Environment.getExternalStorageDirectory()+"/Download/aa.jpg");
OutputStream outputStream=socket.getOutputStream();
byte buffer[]=new byte[4*1024];
int temp =0;
//读取InputStream的数据,写入到OutputStream中
while ((temp=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,temp);
outputStream.flush();
}
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
super.run();
}
}
关于文件操作和Socket操作需要网络权限和文件操作权限,此处提示一下。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET"/>