【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 ...
随机推荐
- Node.js精进(2)——异步编程
虽然 Node.js 是单线程的,但是在融合了libuv后,使其有能力非常简单地就构建出高性能和可扩展的网络应用程序. 下图是 Node.js 的简单架构图,基于 V8 和 libuv,其中 Node ...
- 前端环境搭建nodejs%VScode
nodejs:https://blog.csdn.net/antma/article/details/86104068VScode:https://code.visualstudio.com/Down ...
- Java注解和反射
1.注解(Annotation) 1.1.什么是注解(Annotation) 注解不是程序本身,可以在程序编译.类加载和运行时被读取,并执行相应的处理.注解的格式为"@注释名(参数值)&qu ...
- Vue开发组件之替代marquee标签,超出宽度文字横向滚动效果
一.npm 安装 如果你想安装插件(自己写的)安装 install dependencies npm i marquee-components 使用 在main.js引入 import marquee ...
- docker-compose: 未找到命令,安装docker-compose
1.安装扩展源 sudo yum -y install epel-release 2.安装python-pip模块 sudo yum install python-pip 3.通过命令进行安装 cd ...
- idea启动java Maven项目,出现" java: 程序包xxxx不存在"
解决办法如下:将idea的构建和运行托管到maven下面
- lerna学习笔记
lerna简介 Lerna 是一个优化基于Git+npm的多package项目的项目管理工具,lerna是架构优化的产物,项目复杂度提升后,架构优化的主要目标是以提高ROI为核心的 lerna的主要功 ...
- 利用噪声构建美妙的 CSS 图形
在平时,我非常喜欢利用 CSS 去构建一些有意思的图形. 我们首先来看一个简单的例子.首先,假设我们实现一个 10x10 的格子: 此时,我们可以利用一些随机效果,优化这个图案.譬如,我们给它随机添加 ...
- Josephus问题(Ⅱ)
题目描述 n个人排成一圈,按顺时针方向依次编号1,2,3-n.从编号为1的人开始顺时针"一二"报数,报到2的人退出圈子.这样不断循环下去,圈子里的人将不断减少.最终一定会剩下一个人 ...
- 4-1 Spring框架基础知识
Spring框架基础知识 1.Spring 框架作用 主要解决了创建对象和管理对象的问题. 自动装配机制 2.Spring 框架 (Spring容器,JavaBean容器,Bean容器,Spring容 ...