Socket模拟实现简易文件上传
目的
通过Socket的字节输入输出模拟从客户端上传文件到服务器并保存到服务器的硬盘上
步骤
模拟客户端
- 创建Socket对象
- 通过本地字节流将要上传的文件写入到Socket的字节输出流中
- 等待客户端接受并返回信息
客户端代码
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class client {
public static void main(String[] args) throws IOException {
//创建Socket对象
Socket socket = new Socket("127.0.0.1",8888);
//创建一个本地的文件输入流将要上传的文件写入到Socket的输出流中
InputStream is = new FileInputStream("2.png");//要上传的文件的路径(这里用的相对路径)
int len = 0;
byte[] bs = new byte[1024];
OutputStream os = socket.getOutputStream();
while((len = is.read(bs)) != -1){
os.write(bs,0,len);
}
//这点非常重要,如果不关闭,服务器和客户端都会处于一个阻塞状态,导致两边的程序都无法执行完毕
socket.shutdownOutput();
//用一个字节输入流获取服务器的返回信息并打印
InputStream is0 = socket.getInputStream();
while((len = is0.read(bs)) != -1){
System.out.println(new String(bs,0,len));
}
is.close();
socket.close();
}
}
模拟服务器端
- 创建SeverSocket对象,等待客户端发送请求
- 通过.accept()获取请求的Socket对象
- 把请求的Socket中的字节输出流写入到服务器本地的字节输入流中
- 将本地的字节输入流写入到硬盘的制定位置
- 向客户端发送请数据(“上传成功”)
服务器端代码
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class server {
public static void main(String[] args) throws IOException {
//创建ServerSocket对象
ServerSocket sSocket = new ServerSocket(8888);
//获取请求的Socket对象
Socket ac = sSocket.accept();
//获取请求的Sockte的字节输入流对象(及要上传的文件内容)
InputStream is = ac.getInputStream();
int len = 0;
//创建本地的文件字节输出流来将is中的文件写入到服务的端的硬盘上
FileOutputStream fs = new FileOutputStream("/Users/onen/upLoad.png");
byte[] bs = new byte[1024];
while((len = is.read(bs)) != -1){
fs.write(bs,0,len);
System.out.println(len);
}
//向Socket对象的输出流传递信息,用于给客户端回复(上传成功)
OutputStream os = ac.getOutputStream();
os.write("上传成功!".getBytes());
ac.close();
sSocket.close();
}
}
注意事项
- 在客户端必须要在使用完Socket对象的OutPutStream时对其ShoutDown,否则程序将处于阻塞状态并一直无法结束
- 运行时需要先启动服务器在启动客户端
- 服务端创建的端口号要和客户端创建Socket对象写的端口号一致