Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)
为了方便讲解,我们把
DataOutputstream dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputStream()));
中的dout做为Socket输出流的代言。同样的,din是输入流的代言。
可以造成dout被关闭的操作有:
调用dout.close();或din.close();因为使用这种流关闭,会造成socket被关闭,所以输入输出流都将不可再用。
- 调用socket.close();
- 调用socket.shutdownOutputStream();
单方面关闭dout,此时din还可正常使用。
以下,我将对socket中关闭输出流进行3个测试:
- 输出流关闭测试一:socket关闭吗?
- 输出流关闭测试二:该流是否可以重新开启?
- 输出流关闭测试三:输出缓冲区里的数据是丢弃,还是发送?
测试结果如下:
测试一:
dout.close();会造成socket被关闭,但socket.shutdownOutputStream()不会。
测试二:不可以,会
抛出异常
!测试三:
丢弃
测试代码:
- client端
/*** @author cristianoixiaoming@gmail.com* @version 1.0* @ClassName SocketTestClient* @Package InternetProgram* @ProjectName javaStudy* @description Socket测试客户端* @date 2021-09-09 11:15* @ProductName IntelliJ IDEA*/
public class SocketTestClient {Socket mySocket;DataOutputStream dout;public static void main(String[] args){new SocketTestClient();}public SocketTestClient(){// 输出流关闭的测试一:socket关闭吗?test1();// 输出流关闭测试二:该流是否可以重新开启?test2();// 输出流关闭测试三:输出缓冲区里的数据是丢弃,还是发送?test3();}private void test1() {// 输出流关闭的测试一:socket关闭吗?System.out.println("\n****(shutdownOutput/close方式)关闭输出流,Socket是否关闭?***\n");try {mySocket = new Socket("127.0.0.1",5555);} catch (IOException e) {e.printStackTrace();}try {dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputStream()));//下面这一句主要是用来证明socket确实处于开启状态System.out.println("输出流刚打开,Socket是否关闭?" + mySocket.isClosed());mySocket.shutdownOutput();System.out.println("使用shutdownOutput关闭输出流,Socket是否关闭?" + mySocket.isClosed());dout.close();System.out.println("使用close关闭输出流,Socket是否关闭?" + mySocket.isClosed());} catch (IOException e) {e.printStackTrace();}}public void test2() {// 输出流关闭测试二:使用shutdownOutputStream后,输出流是否可以重新开启?System.out.println("\n****使用shutdownOutputStream后,输出流是否可以重新开启?***\n");try {mySocket = new Socket("127.0.0.1",5555);} catch (IOException e) {e.printStackTrace();}try {dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputStream()));mySocket.shutdownOutput();System.out.println("已经关闭输出流");// 重开输出流dout = new DataOutputStream(mySocket.getOutputStream());dout.writeUTF("是否允许重开输出流?");// 清空输出缓存,确保当dout通道没问题时,消息可以到达服务器dout.flush();} catch (IOException e) {e.printStackTrace();System.out.println("不允许重开输出流");} finally {try {mySocket.close();} catch (IOException e) {e.printStackTrace();}}}private void test3(){// 输出流关闭测试三:输出缓冲区里的数据是丢弃,还是发送?System.out.println("\n***输出缓冲区里的数据是丢弃,还是发送?****\n");try {mySocket = new Socket("127.0.0.1",5555);} catch (IOException e) {e.printStackTrace();}try {dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputStream()));dout.writeUTF("shutdownOutput后,数据发得得出去吗?");mySocket.shutdownOutput();} catch (IOException e) {e.printStackTrace();}}
}
- server端
/*** @author cristianoixiaoming@gmail.com* @version 1.0* @ClassName SocketTestServer* @Package InternetProgram* @ProjectName javaStudy* @description Socket测试服务端* @date 2021-09-09 13:28* @ProductName IntelliJ IDEA*/
public class SocketTestServer extends Thread{private ServerSocket myServerSocket;public static void main(String[] args){SocketTestServer sst = new SocketTestServer();sst.start();}public SocketTestServer(){// 初始化一个ServeSocket端try {int PORT = 5555;myServerSocket = new ServerSocket(PORT);} catch (IOException e) {e.printStackTrace();}}public void run(){while(true){System.out.println("我是服务器,我在5555端口监听....");try {Socket socket = myServerSocket.accept();DataInputStream din = new DataInputStream(new BufferedInputStream(socket.getInputStream()));String msgIn = din.readUTF();System.out.println(msgIn.trim());} catch (IOException e) {e.printStackTrace();}}}
}
client控制台:
server控制台:
参考文章
Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)相关推荐
- 猿创征文|Java中的IO流大家族 (两万字详解)
目录 IO流 概述 分类 四大家族 需要掌握的16个流 文件专属 FileInputstream(读 字节) FileInputStream类的其他常用方法 FileOutputStream (写 字 ...
- java io流顶层_Java中的IO流(一)
一,IO流的分类 A,按照操作的对象不同可分为字节流与字符流 B,按照流的方向不同可分为输入(指从外部存储设备拿文件到内存)流也叫读与输出(指从内存把文件写入到外部存储设备)流也叫写 注:字节流可以操 ...
- 【Java网络编程与IO流】Java中IO流分为几种?字符流、字节流、缓冲流、输入流、输出流、节点流、处理流
Java网络编程与IO流目录: [Java网络编程与IO流]Java中IO流分为几种?字符流.字节流.缓冲流.输入流.输出流.节点流.处理流 [Java网络编程与IO流]计算机网络常见面试题高频核心考 ...
- java输出流输入流的使用_Java中的IO流之文件输入输出流
Java中的IO流之文件输入输出流 1.文件流介绍 文件流是以字节为单位进行读写文件的,所以属于字节流,并且是低级流.文件流位于java.io包下. 输入输出流分别是FileInputSteam和Fi ...
- Java中的IO流(六)
上一篇<Java中的IO流(五)>把流中的打印流PrintStream,PrintWriter,序列流SequenceInputStream以及结合之前所记录的知识点完成了文件的切割与文件 ...
- java体系的四大基类_Java中的io流学习(了解四大基类和基本步骤)
Java中io流四大基类及io流操作四大基本步骤 io流:(input/output)即输入输出流.面向对象的思想之一是面向接口编程,面向父类编程,也就是多态.所以学好基类(父类)很重要. 分类 按处 ...
- java io流分为,Java中的IO流按照传输数据不同,可分为和
Java中的IO流按照传输数据不同,可分为和 答:字节流 字符流 克里斯蒂安 · 麦茨指出:想象的能指就是电影的能指,作为象征的科学,在第三视野范围内的解读,它是( ) 答:建立在共同的永久的背景之中 ...
- 【Java网络编程与IO流】Java之Java Servlet详解
Java网络编程与IO流目录: [Java网络编程与IO流]Java中IO流分为几种?字符流.字节流.缓冲流.输入流.输出流.节点流.处理流 [Java网络编程与IO流]计算机网络常见面试题高频核心考 ...
- Java基础篇:IO流
文章目录 一.File类的使用 File类的概述 File类的实例化 File类的常用方法 二.IO流原理及流的分类 Java IO原理 流的分类 流的体系结构 输入.输出的标准化过程 三.节点流(文 ...
最新文章
- Python翻转字典,以及解决IndentationError: expected an indented block报错!
- 7怎么导入中文文献_如何下载并引用参考文献?
- vba里面的日期数据转换异常(Format error)(使用IsDate方法部分解决)
- CoreCLR文档翻译 - GC的设计
- 威胁情报的几个关键概念
- android 判断资源是否使用6,android-download-manager – Android 6获取下载文件的路径
- c# 使用NPOI按模板导出excel
- mysql创建数据库格式,MySQL 创建数据库的简单示例(utf-8格式)
- 【https】对称加密与非对称加密再理解
- 机器学习规则学习_使用机器学习发现动作规则
- Android xml 画上半圆 矩形,Android 半圆矩形的实现
- 离散数学 数学三大危机
- deeplink跳转快应用返回出现两次系统添加桌面的弹框
- 总谐波失真--THD
- 服务器系统安装提示无法创建新的系统分区,安装win7旗舰版系统时提示“安装程序无法创建新的系统分区”怎么解决...
- 深圳英语培训班有推荐的吗?学习效果好吗?
- 利用Python输出九九乘法表
- Spring框架总结【无比详细】
- C# 淘宝商品微信返利助手开发-(五)返利助手开发(3)淘口令如何通过API转换为链接
- python位运算和float浮点型底层存储原理