🗒️Java Socket踩坑

2023-4-13|2023-5-5
Anthony
Anthony
type
status
date
slug
summary
tags
category
icon
password
💡
场景:客户端和服务器发送信息,发送文件
 
  • 这里我们首先获取到socket的OutputStream然后使用OutputStream的write方法将文件名字以字节的形式输出到客户端。
  • 客户端接收后,向客户端传输文件。这里我们使用一个FileInputStream来读取文件的内容,使用一个buffer来包装文件内容,之后同样地,我们以字节的形式将文件内容发送给服务器。
Server.java
 
Client.java
  • 作为客户端,我们发起建立链接的请求,然后接收服务器传送过来的文件名字。这里我们使用socket提供的InputStream然后用一个BufferedReader封装InputStream来读取内容
  • 接下来,保存文件内容,并且将文件重命名为yyy.txt。这里我们新建一个yyy.txt文件,然后使用write buffer byte的形式将内容写入到文件。最后关闭链接即可。
 
但是!!!!如果服务器发完消息之后没有关闭outputstream()那么就会触发connection reset
notion image
notion image
 
虽然我不是学习java的,但是我还是去查看了一下具体的原因
notion image
这里说只要在这个socket上阻塞的线程都会抛出这个一异常。如果不加入这一行,客户端就不知道服务器已经输入完成,会产生错误。
 
正确是姿势是:
调用Socket的shutdownOutput()方法,底层会告知服务端我这边已经写完了,那么服务端收到消息后,就能知道已经读取完消息,如果服务端有要返回给客户的消息那么就可以通过服务端的输出流发送给客户端,如果没有,直接关闭Socket。
 
http升级https全流程(踩坑指南阿里云建站踩坑记录