在本地实现图片的传输时,socket异常关闭的问题
服务端
public static void main(String[] args) throws IOException {
// 1. 监听 8888 端口
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("8888端口监听中...");
// 2. 获取 socket 对象
Socket socket = serverSocket.accept();
// 3. 获取写入到本地磁盘的输出流
FileOutputStream fos = new FileOutputStream("src/DD的头像.jpg");
// 4. 读取 socket 输入流并写入文件
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf8"));
int readLen;
byte[] buf = new byte[10];
while ((readLen = bis.read(buf)) != -1) {
fos.write(buf, 0, readLen);
}
System.out.println("文件写入成功。。。");
// 5. 向客户端发送保存成功的消息
bw.write("图片保存成功!!!");
bw.close();
// 关闭相关流
fos.close();
bis.close();
socket.close();
serverSocket.close();
}
客户端
public static void main(String[] args) throws IOException {
// 1. 获取连接到服务器的 socket
Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
// 2. 获取磁盘文件的输入流
String filePath = "D:/FileStudy/DD的头像.jpg";
FileInputStream fis = new FileInputStream(filePath);
// 3. 读取磁盘文件
BufferedOutputStream bo = new BufferedOutputStream(socket.getOutputStream());
int readLen;
byte[] buf = new byte[10];
while ((readLen = fis.read(buf)) != -1) {
// 4. 读取的同时,写入到数据通道
bo.write(buf, 0, readLen);
}
bo.flush(); // ==============================================
socket.shutdownOutput();
// 5. 接收服务端发送的消息
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf8"));
System.out.println("接收到服务端的消息:" + br.readLine());
// 关闭相关流
br.close();
bo.close(); // ==============================================
socket.close();
}
其中有很多 "=" 的那两行有点疑问(客户端的15和23行)
- 如果注释 bo.flush(),那么最后的 bo.close() 会爆 socket closed 异常,这是为什么?
- 如果把 bo.flush() 和 bo.close() 都注释掉,传输的图片就会不完整,这又是为啥