socket流的关闭

问题

在使用socket进行全双工通信时,原本以为输入流和输出流是分开关闭的,然而不管关闭哪个都会直接关闭socket;可以使用socket.shutdownInput()和socket.shutdownOutput()

程序代码

服务端

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	public static void main(String[] args) throws Exception {
		ServerSocket serverSocket = new ServerSocket(8080);
		
		Socket socket = serverSocket.accept();
		
		while( true ) {
			try {
				socket.sendUrgentData(0);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				break;
			}
			
		}
				
	}
}

客户端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class Client {
	public static void main(String[] args) throws IOException, Exception {
		Socket socket = new Socket("127.0.0.1", 8080);
		
		InputStream inputStream = socket.getInputStream();
		
//		inputStream.close();

//		BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
//		reader.close();
		
	}

}

使用InputStream

进入bebug模式,在执行到 inputStream.close()后进入SocketInputStream的close()方法,而这个方法是关闭socket流
在这里插入图片描述

使用BufferedReader

执行reader.close()后,最后也是执行SocketInputStream的close()方法;
在这里插入图片描述

reader.close()

现在来看看执行了reader.close()之后的流程,进入debug模式后
首先进入到BufferedReader的close()方法,然后这个方法调用的是Reader对象(in)的close()
在这里插入图片描述
然后进入in.close()里面看看,调用的是StreamDecoder对象(sd)的close方法
在这里插入图片描述
现在看看sd.close()方法里面-----好吧,看不了,不过经过不断的往下走,进入到了SocketInputStream,而这里也会把socket关闭掉;
在这里插入图片描述
至此,流程基本走完了,小总结一下,不管是调用inputStream.close()还是调用reader.close()都会把把socket流关闭掉(至于更深一层的还没理解)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值