为了方便讲解,我们把

DataOutputstream dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputStream()));

中的dout做为Socket输出流的代言。同样的,din是输入流的代言。

可以造成dout被关闭的操作有:

  1. 调用dout.close();或din.close();因为使用这种流关闭,会造成socket被关闭,所以输入输出流都将不可再用。
  2. 调用socket.close();
  3. 调用socket.shutdownOutputStream(); 单方面关闭dout,此时din还可正常使用。

以下,我将对socket中关闭输出流进行3个测试:

  • 输出流关闭测试一:socket关闭吗?
  • 输出流关闭测试二:该流是否可以重新开启?
  • 输出流关闭测试三:输出缓冲区里的数据是丢弃,还是发送?

测试结果如下:

  1. 测试一:dout.close();会造成socket被关闭,但socket.shutdownOutputStream()不会。

  2. 测试二:不可以,会抛出异常

  3. 测试三:丢弃

测试代码:

  • 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流后,发生什么事?(以关闭输出流为例)相关推荐

  1. 猿创征文|Java中的IO流大家族 (两万字详解)

    目录 IO流 概述 分类 四大家族 需要掌握的16个流 文件专属 FileInputstream(读 字节) FileInputStream类的其他常用方法 FileOutputStream (写 字 ...

  2. java io流顶层_Java中的IO流(一)

    一,IO流的分类 A,按照操作的对象不同可分为字节流与字符流 B,按照流的方向不同可分为输入(指从外部存储设备拿文件到内存)流也叫读与输出(指从内存把文件写入到外部存储设备)流也叫写 注:字节流可以操 ...

  3. 【Java网络编程与IO流】Java中IO流分为几种?字符流、字节流、缓冲流、输入流、输出流、节点流、处理流

    Java网络编程与IO流目录: [Java网络编程与IO流]Java中IO流分为几种?字符流.字节流.缓冲流.输入流.输出流.节点流.处理流 [Java网络编程与IO流]计算机网络常见面试题高频核心考 ...

  4. java输出流输入流的使用_Java中的IO流之文件输入输出流

    Java中的IO流之文件输入输出流 1.文件流介绍 文件流是以字节为单位进行读写文件的,所以属于字节流,并且是低级流.文件流位于java.io包下. 输入输出流分别是FileInputSteam和Fi ...

  5. Java中的IO流(六)

    上一篇<Java中的IO流(五)>把流中的打印流PrintStream,PrintWriter,序列流SequenceInputStream以及结合之前所记录的知识点完成了文件的切割与文件 ...

  6. java体系的四大基类_Java中的io流学习(了解四大基类和基本步骤)

    Java中io流四大基类及io流操作四大基本步骤 io流:(input/output)即输入输出流.面向对象的思想之一是面向接口编程,面向父类编程,也就是多态.所以学好基类(父类)很重要. 分类 按处 ...

  7. java io流分为,Java中的IO流按照传输数据不同,可分为和

    Java中的IO流按照传输数据不同,可分为和 答:字节流 字符流 克里斯蒂安 · 麦茨指出:想象的能指就是电影的能指,作为象征的科学,在第三视野范围内的解读,它是( ) 答:建立在共同的永久的背景之中 ...

  8. 【Java网络编程与IO流】Java之Java Servlet详解

    Java网络编程与IO流目录: [Java网络编程与IO流]Java中IO流分为几种?字符流.字节流.缓冲流.输入流.输出流.节点流.处理流 [Java网络编程与IO流]计算机网络常见面试题高频核心考 ...

  9. Java基础篇:IO流

    文章目录 一.File类的使用 File类的概述 File类的实例化 File类的常用方法 二.IO流原理及流的分类 Java IO原理 流的分类 流的体系结构 输入.输出的标准化过程 三.节点流(文 ...

最新文章

  1. Python翻转字典,以及解决IndentationError: expected an indented block报错!
  2. 7怎么导入中文文献_如何下载并引用参考文献?
  3. vba里面的日期数据转换异常(Format error)(使用IsDate方法部分解决)
  4. CoreCLR文档翻译 - GC的设计
  5. 威胁情报的几个关键概念
  6. android 判断资源是否使用6,android-download-manager – Android 6获取下载文件的路径
  7. c# 使用NPOI按模板导出excel
  8. mysql创建数据库格式,MySQL 创建数据库的简单示例(utf-8格式)
  9. 【https】对称加密与非对称加密再理解
  10. 机器学习规则学习_使用机器学习发现动作规则
  11. Android xml 画上半圆 矩形,Android 半圆矩形的实现
  12. 离散数学 数学三大危机
  13. deeplink跳转快应用返回出现两次系统添加桌面的弹框
  14. 总谐波失真--THD
  15. 服务器系统安装提示无法创建新的系统分区,安装win7旗舰版系统时提示“安装程序无法创建新的系统分区”怎么解决...
  16. 深圳英语培训班有推荐的吗?学习效果好吗?
  17. 利用Python输出九九乘法表
  18. Spring框架总结【无比详细】
  19. C# 淘宝商品微信返利助手开发-(五)返利助手开发(3)淘口令如何通过API转换为链接
  20. python位运算和float浮点型底层存储原理

热门文章

  1. java 学习知识汇总
  2. [luoguP1773] 符文之语_NOI导刊2010提高(02)(DP)
  3. mybais传入多个参数的方法
  4. Selenium简介以及selenium环境搭建
  5. MAC终端配色Solarized
  6. 去掉一键还原 开机按k键
  7. Linux下gcc入门
  8. lstm网络python代码实现
  9. linux查看服务器网络状态
  10. tensorflow安装教程 win10环境