网络通信IO模型-BIO

news/2024/11/9 2:07:48/

承接上文网络通信IO模型上

BIO的Java代码

服务端创建一个ServerSocket,绑定了端口号8090,目的是让客户端和服务端建立连接后进行通信,然后进入死循环,死循环里面会调用server.accept得到一个socket客户端,打印客户端的端口号,然后启动一个线程,为什么要启动一个线程?

因为accpet会阻塞,如果因为没有客户端建立连接,就没有返回值,会一直阻塞,只有客户端建立连接,才能从阻塞变成返回,然后再读取客户端发送过来的数据,读取输入流并打印用户发送的数据,读取的话,也有可能变成阻塞状态,如果客户端一直不发送数据过来,服务器端就会一直阻塞,所以要把客户端读取的过程放到另外一个线程里面去做。

通过strace命令追踪进程情况

strace -ff -o out java TestSocket
  • ff 代表追踪这个程序所有的线程

通过strace命令追踪java程序有多少个线程,每个线程对内核产生哪些系统调用,都会记录下来。

启动该程序,首先会打印

表示第一步创建一个ServerSocket,绑定了8090端口,然后进入阻塞状态,直到有客户端建立连接。

这时多了以out开头、数值结尾的8个文件,代表8个线程。

当有一个客户端连接的时候,会new一个新线程,就变成9个out文件了。

一个java程序刚启动的时候,它自身就是多线程的,有些线程负责gc回收,有些线程负责监控客户端建立的socket连接等。

上图中的主线程是8211,

查看out.8211就可以看到java程序在运行时和内核交互的整个过程。

每一行最前面代表系统调用的内核函数名称,接着是入参,最后是返回值。

先看这个文件的最后一行,accept阻塞在这里了,一直在等待客户端的连接。

首先系统调用socket方法得到一个文件描述符3即对应ServerSocket,将3绑定到8090端口上,绑定完之后,下面listen表示开始监听3,其实是在监听8090这个端口。

从阻塞到不阻塞的过程是怎样的?

启动TestSocket程序,进程编号是8211,主线程编号也是8211,监听端口是8090,目标地址可以是任何地址和任何端口。

用nc模拟一个客户端建立连接

nc localhost 8090

nc(net connection或net cat)就想象成一个网络通信的客户端,它能帮你完成tcp的三次握手。

TestSocket程序就会打印一个客户端连接进来了,

表示客户端申请了一个随机端口号连接到了服务端8090,

刚才accept 3 阻塞在这里了,一个客户端连接进来之后,就会立刻返回一个代表客户端连接的文件描述符5,并且绑定了客户端端口号,

现在多了一个连接状态,目标程序是本地服务(127.0.0.1)的8090端口,来自于本地的59033这个客户端程序,

59033正好对应nc进程。

TestSocket程序从开始只有一个文件描述符3,然后一个客户端建立了连接得到了文件描述符5,然后Java主线程启动一个子线程读取文件描述符5.

如何启动一个新的线程?

调用clone这个内核的系统调用创建了一个新的线程8281。

java的线程其实就是调用内核的系统调用clone,然后得到一个8281线程,这个线程同属于最开始的进程id 8211,

8211代表一个线程组。

此时又多了一个8281的线程文件,查看该文件

调用了内核的recv方法,文件描述符5是在主线程产生的一个客户端socket连接,用另外一个线程去读文件描述符5。

主线程继续accpet。

每多一个连接,就多了一个线程,如果有一万个连接,就会有一万个线程。

整体过程

先调用socket返回fd 3,将fd 3绑定8090端口,然后监听8090端口。

while死循环,先accept接收客户端的连接,如果没有连接就一直阻塞,如果有连接,则读取连接,如果客户端一直没有发送数据过来,就会一直阻塞,所以为了不影响主线程接收连接,再创建一个新的线程,用于读取每个客户端发送过来的数据。

这是最古老的网络IO模型BIO。

一个线程对应一个连接,优势是可以接受很多连接。

弊端:如果进程特别多或线程特别多的时候,就会造成内存的浪费,cpu调度也会消耗了更多cpu的时间片。

BIO中有2个方法是阻塞(BLOCKING)的,一个是主线程的accept,另一个是recv或read这2个方法。

这2个系统调用会阻塞,所以不能把都有可能阻塞的操作放到一个线程里 ,否则一个阻塞就会干预到另外一个阻塞,所以解决BIO模型的弊端 ,只需要非阻塞(NON BLOCKING)就可以了,非阻塞网络模型就是NIO了。


http://www.ppmy.cn/news/99758.html

相关文章

【提示学习】HPT: Hierarchy-aware Prompt Tuning for Hierarchical Text Classification

论文信息 名称内容论文标题HPT: Hierarchy-aware Prompt Tuning for Hierarchical Text Classification论文地址https://arxiv.org/abs/2204.13413研究领域NLP, 文本分类, 提示学习, 层级标签文本分类提出模型HPT(Hierarchy-aware Prompt Tuning)来源EMNLP 2022源码https://gi…

SNP一秒解答SAP云迁移的四种部署模式

为了方便不同需求的用户,多云计算提供商提供了多种形式的云服务,常见的有公有云、私有云、混合云和社区云等。 私有云(Private Clouds) 是为一个客户单独使用而构建的,因而提供对数据、安全性和服务质量的最有效控制。该公司拥有基础设施&am…

强化学习笔记

目录 Q-Learning DQN 拟合Q 评估方式 基本概念 业务实践 参考 Q-Learning 动态规划Dynamic Programming并且由此引出了Q-Learning算法。可能一些知友不是特别理解。那么这里我们再用简单的语言描述一下整个思路是什么。 为了得到最优策略Policy,我们考虑估算…

从sftp下载大文件到浏览器

从sftp下载大文件到浏览器 问题方案相关依赖包相关代码片段(后端)文件信息缓存工具类-FileChunkCache文件信息对象-FileDetailsftp传输进度监控-FileProgressMonitor切片工具类-ChunkService文件下载服务-AsyncDownloadService 问题 近期遇到直接使用sf…

多元回归预测 | Matlab蛇群算法(SO)优化最小二乘支持向量机回归预测,SO-LSSVM回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab蛇群算法(SO)优化最小二乘支持向量机回归预测,SO-LSSVM回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %---…

数据类型.

数据类型 数据类型分类 数值类型 tinyint类型 数值越界测试: mysql> create table tt1(num tinyint); Query OK, 0 rows affected (0.02 sec)mysql> insert into tt1 values(1); Query OK, 1 row affected (0.00 sec)mysql> insert into tt1 values(128…

Java中ReentrantLock的概念深入理解

ReentrantLock和Synchronized的区别 核心区别 ReentrantLock是一个类,Synchronized是Java中的一个关键字。 两者都是JVM层面实现互斥锁的方式 效率区别 线程竞争激烈推荐使用ReentrantLock去实现,不存在锁竞争观念; Synchronized是存在锁升…

2023商家外卖数据

商家列表 外卖商品销量 shop_channel varchar(20) DEFAULT NULL, shop_system varchar(20) DEFAULT NULL, shop_system_no varchar(50) DEFAULT NULL, shop_platform varchar(20) DEFAULT NULL, shop_id varchar(50) NOT NULL, shop_id_str varchar(50) NO…