【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 ...
随机推荐
- vue大型电商项目尚品汇(后台篇)day01
开始我们后台篇的内容,前面处理了一些事情,去学校完成授位仪式,由校长授位合影,青春不留遗憾,然后还换了一个电脑,征战了四年的神船终于退役了,各种各样的小毛病是真的烦人. 现在正式开始后台篇的内容,做了 ...
- 如何实现Springboot+camunda+mysql的集成
本文介绍基于mysql数据库,如何实现camunda与springboot的集成,如何实现基于springboot运行camunda开源流程引擎. 一.创建springboot工程 使用IDEA工具, ...
- Flutter 实现“斑马纹”背景(需要变换颜色)
Flutter 实现"斑马纹"背景 由于工作中项目需求,需要将H5转换为Flutter代码. 其中的斑马纹背景需要根据接口返回的颜色来渲染,所以不能只是图片形式,无法通过decor ...
- 我用Python做了一个咖啡馆数据分析
在做案例前,我还想回答大家一个疑问,就是excel做数据分析可以实现Python一样的效果,那用Python的意义在哪呢? 经过这段时间学习理解,我的回答是: (https://jq.qq.com/? ...
- Java:如何打印整个字符串数组?
例: public static void main(String[] args) { String prodName = "雇员姓名,雇员唯一号"; String[] prodN ...
- 不是吧?30秒 就能学会一个python小技巧?!
大家好鸭!我是小熊猫 很多学习Python的朋友在项目实战中会遇到不少功能实现上的问题,有些问题并不是很难的问题,或者已经有了很好的方法来解决.当然,孰能生巧,当我们代码熟练了,自然就能总结一些好用的 ...
- 面试官:Redis 过期删除策略和内存淘汰策略有什么区别?
作者:小林coding 计算机八股文网站:https://xiaolincoding.com 大家好,我是小林. Redis 的「内存淘汰策略」和「过期删除策略」,很多小伙伴容易混淆,这两个机制虽然都 ...
- Java学习dayo4
分支结构和循环语句 1.包的概念 包就是文件夹 包的命名规范:全小写,域名倒置,不能以点开头或结尾,可以包含点,每存在一个点表示一个子目录 举例:com.baidu.demo 定义包后,包中的java ...
- Java开发学习(十一)----基于注解开发bean作用范围与生命周期管理
一.注解开发bean作用范围与生命周期管理 前面使用注解已经完成了bean的管理,接下来将通过配置实现的内容都换成对应的注解实现,包含两部分内容:bean作用范围和bean生命周期. 1.1 环境准备 ...
- 常用Linux音译
su:Swith user 切换用户,切换到root用户 cat: Concatenate 串联 uname: Unix name 系统名称 df: Disk free 空余硬盘 du: Disk u ...