java socket对应的是网络协议中的tcp,tcp的三次握手、四次挥手、11中状态什么的这里就不说了,不知道大家平常使用socket的时候如果不注意的情况下,会不会遇到各种异常报错。
例如:
java.net.SocketException:socket is closed
错误提示的出现场景:
自己主动关闭了socket,但是之后还从里面读写数据
Software caused connection abort: socket write error
错误提示的出现场景:
对方已经关闭socket,依旧向对方写数据
connection reset (by peer)
错误提示出现的场景:
一端socket被关闭,另一端仍然发送数据,发送的第一个数据包 connection reset by peer
一端socket退出,退出时为关闭连接,另一端读数据 connection reset
所以在使用socket时,需要约定好双方读写完成的条件,然后关闭输入输出流:
socket.shutdownInput();
socket.shutdownOutput();
即当一方写入完成后,调用shutdownOutput关闭输出流,这时候对方的read方法就会返回-1,这时候对方就知道你写完了,对方可以关闭输入流,然后等待对方写入完成调用shutdownOutput后己方再调用shutdownInput,双方就正常关闭了输入输出流,这时候socket就不会出现异常了。
下面是一个socket交互的例子:
server端
public class OioServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket socket = serverSocket.accept();
System.out.println("socket = " + socket);
new Thread(() -> {
try {
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
out.write("hello! I get your message that is follow".getBytes(Charset.forName("UTF-8")));
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) != -1) {
System.out.print(new String(buf, 0, len, Charset.forName("UTF-8")));
out.write(buf, 0, len);
}
out.write("\n end \n".getBytes(Charset.forName("UTF-8")));
out.flush();
socket.shutdownInput();
socket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
client端
public class OioClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 8080);
InputStream in = socket.getInputStream();
new Thread(() -> {
BufferedInputStream bufferIn = new BufferedInputStream(in);
byte[] buf = new byte[1024];
try {
int len;
while ((len = bufferIn.read(buf)) != -1) {
System.out.print(new String(buf, 0, len, Charset.forName("UTF-8")));
}
}catch (Exception e) {
e.printStackTrace();
}
try {
socket.shutdownInput();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
OutputStream out = socket.getOutputStream();
int cout = 10;
while (cout-- > 0) {
out.write(("this time is " + System.currentTimeMillis() + "\n").getBytes("UTF-8"));
}
socket.shutdownOutput();
}
}
今天的文章java socket的正确关闭姿势分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/8751.html