基本概念

TCP协议:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。

Socket:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

需求分析

* 1,客户端
 *      创建Socket连接服务器(指定IP地址,端口号)通过IP地址找到对应的服务器
 *      调用Socket的getInputStream()和getOutputStream()方法获取和服务器端相连的IO流
 *      输入流可以读取服务器端输出流写出的数据
 *      输出流可以写出数据到服务端的输入流
 * 
 * 2,服务端
 *      创建ServerSocket(需要指定端口号)
 *      调用ServerSocket的accept()方法接受一个客户端请求,得到一个Socket
 *      调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
 *      输入流可以读取客户端输出流写出的数据
 *      输出流可以写出数据到客户端的输入流

问题分析

在使用socket时,需要约定好双方读写完成的条件,然后关闭输入输出流:

socket.shutdownInput();

socket.shutdownOutput();

即当一方写入完成后,调用shutdownOutput关闭输出流,这时候对方的read方法就会返回-1,这时候对方就知道你写完了,对方可以关闭输入流,然后等待对方写入完成调用shutdownOutput后己方再调用shutdownInput,双方就正常关闭了输入输出流,这时候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.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

参考文章

https://stackoverflow.com/questions/14010194/detecting-socket-disconnection

https://blog.csdn.net/qq_36666651/article/details/84191732

https://blog.csdn.net/qq_41264055/article/details/81353907

JAVA——TCP连接中Socket的正确关闭方式相关推荐

  1. TCP连接中time_wait在开发中的影响-搜人以鱼不如授之以渔

    根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),T ...

  2. 几种TCP连接中出现RST的情况

    UNIX网络编程上说:产生RST的三个条件是:目的地为某端口的SYN到达,然而在该端口上并没有正在监听 的服务器:TCP想取消一个已有链接:TCP接收到一个根本不存在的连接上的分节. 几种TCP连接中 ...

  3. Linux数据链路tcp失败,TCP连接中的异常断开情况处理

    1.TCP连接中可能出现的异常断开情况 假设存在这样一种情况:在两个不同的主机Machine1.Machine2系统上分别运行两个应用程序Application1.Application2,在Appl ...

  4. 网络基础2-3(TCP协议,三次握手,四次挥手,TIME_WAIT状态的作用,TCP如何保证可靠传输,TCP连接中状态转化,滑动窗口,流量控制,快速重传,拥塞窗口,延迟应答,捎带应答,粘包问题)

    TCP协议 TCP协议概念 TCP全称为 "传输控制协议(Transmission Control Protocol"). 人如其名, 要对数据的传输进行一个详细的控制 TCP协议 ...

  5. 【Tcp】TCP连接中存在大量TIME_WAIT、CLOSE_WAIT的原因【转】

    TCP连接中存在大量TIME_WAIT.CLOSE_WAIT的原因 TCP通信图 TIME_WAIT CLOSE_WAIT TCP通信图 TIME_WAIT 表示客户端主动关闭socket. 原因: ...

  6. 【网络通信与信息安全】之深入解析TCP连接中如何确定客户端的端口号

    一.前言 在 TCP 连接中,客户端在发起连接请求前会先确定一个客户端的端口,然后用这个端口去和服务器端进行握手建立连接.那么在 Linux 上,客户端的端口到底是如何被确定下来的呢? 事实上,我们平 ...

  7. TCP连接中的异常情况

    TCP 保活机制( keepalive)可以在双方没有数据交互的情况,通过探测报文,来确定对方的 TCP 连接是否存活. 无数据交互的情况下的异常[主机崩溃|进程崩溃]: 1在没有开启 TCP kee ...

  8. 在TCP连接中,如果有一方宕机或者进程崩溃会发生什么?

    当情况为宕机时: 首先是keepalive的影响: 在没有开启 TCP keepalive,且双方一直没有数据交互的情况下,如果客户端的「主机崩溃」了,会发生什么. 客户端主机崩溃了,服务端是无法感知 ...

  9. 关于tcp连接中timewait的作用

    今天简单的谈一下tcp连接中timewait的作用,如果没有timewait会发生什么呢? 我们知道首先请求关闭连接的一方会存在timewait状态. 首先我们来看一下tcp四次挥手的过程示意图: 客 ...

最新文章

  1. Go web之旅(路由篇)
  2. Deeplearning 入门篇
  3. AngularJS 表单数据验证及错误信息提示
  4. 列注释_【EXCEL检查问题】:如何快速检查并删除EXCEL中隐藏的工作表、行、列等信息...
  5. flex弹性布局笔记
  6. 关于“幽灵架构”的补充说明5:改造控制器
  7. Symfony1.4.11学习笔记(四):数据模型
  8. 弹出窗口刷新它的父页面后。出现不重新发送信息,则无法刷新网页
  9. 装饰器python3 默认_python3【基础】-装饰器
  10. 计算阶乘的两种实现方式(Java)
  11. 【C++】(三) MFC入门教程 (VS 2005)
  12. linux时钟变慢,linux系统时钟变慢的思考和解决方案
  13. 山西师范大学数学与计算机学院宿舍,数计学院宿舍文化节之PPT展示大赛决赛圆满结束...
  14. 图像分类数据集 (FASHION-MNIST)
  15. JMX : MXBean
  16. 塔望食业洞察|轻食代餐消费洞察、市场现状、竞争格局及未来趋势
  17. 如何使用cocos2dx 制作一个多向滚屏坦克类射击游戏-第二部分
  18. 搜索引擎排名和Page Rank 关联分析
  19. 最全的世界汽车标志欣赏和LOGO释义
  20. 7、【STM32】独立看门狗和窗口看门狗(IWDG、WWDG)实验

热门文章

  1. 快评《19家网站内容低俗被曝光》
  2. js参数使用时常犯的一个低级错误
  3. matlab红字怎么删除,购买方开具红字信息表如何作账务?
  4. 对象 普通po转_谈谈C++对象的构造
  5. scala java抽象理解_Scala - 抽象类型和隐式参数解析
  6. 计算机打印机用户,如何:在 Windows 窗体中选择连接到用户计算机的打印机
  7. python中的列表分片详解_python列表与元组详解实例
  8. 四十七、SQL 语法总结
  9. 四、学编程语言前,不了解Git,怎么入坑
  10. 化工原理各章知识点汇总