【Java】学习路径57-TCP协议客户端与服务器端的关闭
在TCP协议中,如果发送端(客户端)关闭了,那么接收端(服务器端)端就会收到这个消息。
那么接收端(服务器端)怎么知道的呢?
我们进行实验:
首先在发送端中编写一段程序,当用户输入“end”的时候,关闭发送端。
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class TCP_Send {
public static void main(String[] args) throws Exception {
//TCP使用的是Socket
Socket s = new Socket("127.0.0.1",8989);
OutputStream ops = s.getOutputStream();
Scanner sc = new Scanner(System.in);
while (true){
String str = sc.next();
if(str.equals("end"))
break;
ops.write(str.getBytes());
}
s.close();
}
}
接收端(服务器端)与上一章最后所示一样。
重复代码
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCP_Receive {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(8989);
Socket clinet = ss.accept();//会暂停,等待连接!
InputStream input = clinet.getInputStream();
byte[] buf = new byte[1024];
while(true){
int length = input.read(buf);
System.out.println(new String(buf,0,length));
}
// clinet.close();
// ss.close();
//输入输出流,Socket会自动帮我们关闭
}
}
然后分别运行接收端、发送端。


接收端(服务器端)报出上面异常。
于是我们开始分析错误的原因
根据提示提示最下面一行找到了错误(一般错误/异常最下面一行就是我们自己写的代码,上面的都是系统代码不会有错的)
System.out.println(new String(buf,0,length));
然后分析这一行的错误,我们往上一层查找。

发现错误原因是这一行代码
checkBoundsOffCount(offset, length, bytes.length);
即:参数超出正常范围。
经过查找,我们发现length是-1,导致的错误。
也就是说,在我们编写的这行代码中,当流读取完了的时候,(发送端关闭的时候,这个流的生命也就走到尽头了)
int length = input.read(buf);
返回值为-1
大家可以复习一下InputStream的知识。
也就是说,我们可以将read返回值是否为-1作为发送端(用户端)是否关闭的信号。
这就回答了文章开头所提的问题。
任务:当发送端关闭时,接收端也自动关闭
思路:增加一个判断,当length==-1时,跳出死循环,调用close()。又或者直接在while中判断即可
接收端(服务器端):
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCP_Receive {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(8989);
Socket clinet = ss.accept();//会暂停,等待连接!
InputStream input = clinet.getInputStream();
byte[] buf = new byte[1024];
int length = -1;
while((length = input.read(buf))>=0){
System.out.println(new String(buf,0,length));
}
clinet.close();
ss.close();
//输入输出流,Socket会自动帮我们关闭
}
}
效果:
当输入end后,服务器端、客户端双双关闭


这就是TCP协议的好处
TCP协议中,接收端知道发送端什么时候关闭。
UDP协议中,接收端和发送端相互不知道对方的情况。
【Java】学习路径57-TCP协议客户端与服务器端的关闭的更多相关文章
- Java学习路径及练手项目合集
Java 在编程语言排行榜中一直位列前排,可知 Java 语言的受欢迎程度了. 实验楼上的[Java 学习路径]中将首先完成 Java基础.JDK.JDBC.正则表达式等基础实验,然后进阶到 J2SE ...
- Java学习路径(抛光砖)
这就是我刚刚在五孔问答中找到的Java学习路线图抛光砖价格.我个人认为,这条Java学习路线是可以的.它是2018年相对较新的Java学习路线,更符合企业就业标准. Java学习路径的第一阶段:Jav ...
- TCP/IP详解学习笔记(9)-TCP协议概述
终于看到了TCP协议,这是TCP/IP详解里面最重要也是最精彩的部分,要花大力气来读.前面的TFTP和BOOTP都是一些简单的协议,就不写笔记了,写起来也没啥东西. TCP和UDP处在同一层---运输 ...
- Java学习路径:不走弯路,这是一条捷径
1.如何学习编程? JAVA是一种平台.也是一种程序设计语言,怎样学好程序设计不只适用于JAVA,对C++等其它程序设计语言也一样管用.有编程高手觉得,JAVA也好C也好没什么分别,拿来就用.为什么他 ...
- http协议客户端向服务器端请求时一般需要发送的内容
out.println("GET /shopping/index.html HTTP/1.1");//请求行 包括请求方式,文件路径, http协议版本(必写)请求头.... ou ...
- 基于TCP的客户端、服务器端socket编程
一.实验目的 理解tcp传输客户端服务器端通信流程 二.实验平台 MAC OS 三.实验内容 编写TCP服务器套接字程序,程序运行时服务器等待客户的连接,一旦连接成功,则显示客户的IP地址.端口号,并 ...
- 基于TCP的客户端和服务器端的代码设计
实验平台 linux 实验内容 编写TCP服务器和客户端程序,程序运行时服务器等待客户端连接.一旦连接成功,服务器显示客户端的IP地址和端口号,并向客户端发送字符串 实验原理 TCP是面向连接的通信, ...
- Java学习路径
-------第一部分:基础语法-------- 1.输出语句 1.1 hello world 1.2 拼接输出.换行和不换行输出 1.3 拼接变量输出 2.输入语句: 2.1 定义变量,赋值(整数. ...
- java网络编程,简单的客户端和服务器端
1.服务器端 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import ...
随机推荐
- 1.设计模式第一步-《设计模式从头到脚舔一遍-使用C#实现》
更新记录: 完成第一次编辑:2022年4月23日20:29:33. 加入小黄人歌曲:2022年4月23日21:45:36. 1.1 设计模式(Design Pattern)是什么 设计模式是理论.是前 ...
- 6000字Locust入门详解
目录 一.Locust 性能测试 (一). 性能测试工具 主流性能测试工具对比 认识Locust (二) locust 基本用法 1.安装locust 2.编写用例 3. 启动测试 GUI 模式启动 ...
- Phantomjs实用代码段(持续更新中……)
一.下载 下载链接二.解压安装包 直接解压即可三.配置环境变量 找到高级系统设置,打开它,出现以下图.点击环境变量. 分别点击编辑按钮 分别新建添加当初的解压路径,到bin文件夹.点击确定. 这样,环 ...
- CVPR2022 | 可精简域适应
前言 在本文中,作者引入了一个简单的框架,即Slimmable Domain Adaptation,以通过权重共享模型库改进跨域泛化,从中可以对不同容量的模型进行采样,以适应不同的精度效率权衡.此外, ...
- ansible-playbook批量修改密码
1. 将服务器ip写到ansible hosts文件中 2. 实现免密登录服务器 将ansible服务器公钥拷贝到目标服务器用户目录下的.ssh/authorized_keys 手动连接一次或者自己写 ...
- Halcon · 曲线宽度检测算法总结
视觉检测中,直线的宽度很好检测,即两条平行线的垂直距离,而曲线的宽度检测则需要另辟蹊径. 检测图像中曲线边缘的宽度,用以判断边缘是否崩缺,总结如下五种方法: 1.图像匹配判断 概述:建立标准图像参考, ...
- NC14683 储物点的距离
NC14683 储物点的距离 题目 题目描述 一个数轴,每一个储物点会有一些东西,同时它们之间存在距离. 每次给个区间 \([l,r]\) ,查询把这个区间内所有储物点的东西运到另外一个储物点的代价是 ...
- Spring XmlBeanFactory 容器的基本实现
容器的基本用法 熟悉 Spring 的朋友应该都很了解下段代码: public void testBeanFactory() { BeanFactory bf = new XmlBeanFactory ...
- C语言求100以内的和的4种方式
C语言的一个很经典的例子,帮助熟练运行几个循环的写法 * 方法一(do---while语句) #include main () { int i,sum=0; do { sum=sum+i; i++; ...
- labview从入门到出家9(进阶篇)--串口通讯
Labview在工控领域,如产线,实验室等环境用得较多,其中与仪器通讯控制的方式有串口(RS232,RS485,TTL),GPIB,网口,CAN等,其中串口在仪器还有单片机控制中用来调试居多.(很 ...