架构师训练营 - 第八周 - 学习总结

用户头像
韩挺
关注
发布于: 2020 年 07 月 29 日

关于经典阻塞I/O中一个端口多个Socket的理解

在经典的阻塞 I/O设计中



每个应用即server占用一个端口,每次连接进来创建一个socket,这个socket绑定一个线程,该进程阻塞,直至socket中有数据后被唤醒。

这里的socket表示一次tcp连接,由源地址,源端口,目标地址,目标端口构成作为唯一标记(同一个客户端通过变更源端口来区分,代码如下),等服务器端网卡获取新的数据后,操作系统按照该标记找到对应socket,将拆解后的tcp层数据写入该socket的缓冲区并唤醒等待线程。



通过模拟两次http请求(curl http://127.0.0.1:8081),查看输出的Socket

public class SocketServerApplication {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8081);
while (true){
new Thread(new Handler(ss.accept())).start();
}
} catch (IOException ex) {
ex.printStackTrace();
}

}

static class Handler implements Runnable {
final Socket socket;

Handler(Socket s) {
socket = s;
}

@Override
public void run() {
System.out.println(socket);
}
}
}


输出:

Socket[addr=/127.0.0.1,port=62337,localport=8081]

Socket[addr=/127.0.0.1,port=62344,localport=8081]



用户头像

韩挺

关注

还未添加个人签名 2019.01.25 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
作业请添加“极客大学架构师训练营”,便于分类
2020 年 07 月 29 日 17:44
回复
没有更多了
架构师训练营 - 第八周 - 学习总结