写点什么

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

用户头像
韩挺
关注
发布于: 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
回复
没有更多了
架构师训练营 - 第八周 - 学习总结