ServerSocket和线程关系

先来一段JAVA创建ServerSocket的方法

	public class TCPAccept {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(8080);
        while (true) {
            Socket accept = serverSocket.accept();
            System.out.println("获取到连接");
            System.out.println(Thread.currentThread().getName()+"  id:"+Thread.currentThread().getId());
            InputStream inputStream = accept.getInputStream();
            int read = 0;
            byte[] bytes = new byte[1024];
            while ((read = inputStream.read(bytes)) != -1) {
                System.out.println(new String(bytes,0, read));
            }
        }
    }
}

开启服务。用telnet进行连接。
在这里插入图片描述
然后ctrl + ]
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当我再开一个命令窗口连接服务器的时候。
在这里插入图片描述
发现服务器是没有反应的。发生了堵塞。
在这里插入图片描述
当我断开第一个连接。第二个连接才能正常的执行。

为此我直到主线程肯定在某个调用中等待,导致其他想创建服务的连接堵塞,同样基于BIO模型,来一个请求要创建一个线程来处理。我想找到到底是哪个方法造成我的线程堵塞。

代码变成如图
在这里插入图片描述
为此我直到现在主线程在 serverSocket.accept()中等待客户端请求。
在这里插入图片描述
当我发起请求后,主线程并没有堵塞,而是再次执行了一次while循环,回到了serverSocket.accept();至此我直到造成堵塞主线程堵塞,导致新连接不是它。
在这里插入图片描述
加了这段代码,结果不变。
在这里插入图片描述
在这里插入图片描述
唯有在调用inputStream.read()的时候。线程才会被堵塞。点进方法内部基于实现类SocketInputSteam一个本地方法导致线程堵塞
在这里插入图片描述

为此我们直到只有当我们调用read的方法时候,线程才会被堵塞。在我还没开始看Netty的时候,思考一下如何才能做到nio一样的,堵塞非同步IO模型。因为客户端和服务器建立了连接之后,不是一直都会有数据上的来往。一直堵塞监听是否有数据的输入,不仅导致线程堵塞,还会因为避免堵塞从而创建过多线程来处理请求。既然基于SocketInputSteam的Read方法。只有客户端断开,连接才自动断开。为此设想应该不会使用这个本地方法。基于JS一样的循环事件监听。把真正请求数据inputsteam打包成一个个才行。当然这里我没有把测outputsteam结果方法出(它的write方法是不会堵塞的)所以只要我把请求打包好。在请求中封装上outputsteam、处理完成后服务器一样直到该向哪个客户端响应。当然这里有个重点就是如何监听是否发送了请求。这里我想到了操作系统当中输入输出设备的中断机制。

在这里插入图片描述

接下来开始学习Netty加油!找出问题的答案

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值