套接字不断监听想要连接的客户端(在自己的线程中).当连接发生时,会引发一个事件,产生另一个线程来执行连接进程.在连接过程中,客户端被分配它自己的与服务器进行通信的套接字.然后,服务器等待来自客户端的数据,并且当数据到达时,产生一个事件,该事件产生线程以将数据从流读入缓冲器.
我的问题是:
我的理解怎么样?
每个客户端套接字是否需要自己的线程来监听数据?
数据如何路由到正确的客户端套接字?这是TCP / UDP /内核的内容吗?
在这个线程环境中,什么样的数据通常被共享,有什么争论点?
任何澄清和补充说明将不胜感激.
编辑:
关于通常共享什么数据和争用点的问题,我意识到这更多是一个实现细节,而不是一个接受连接和发送/接收数据的一般过程的问题.我看过几个实现(SuperSocket和Kayak),并注意到一些同步,如会话缓存和可重用缓冲池.随意忽略这个问题.我赞赏你的所有反馈.
解决方法
套接字服务器或多或少地像这样工作:
>监听套接字设置为接受连接,并添加到socketset
>检查套接字集的事件
>如果侦听套接字有挂起的连接,则通过接受连接创建新的套接字,然后添加到套接字集
>如果连接的套接字有事件,则调用相关的IO功能
>套接字集再次检查事件
这在一个线程中发生,您可以轻松地在单个线程中处理数千个连接的套接字,并且通过引入线程使得更复杂的几个有效原因.
while running select on socketset for each socket with events if socket is listener accept new connected socket add new socket to socketset else if socket is connection if event is readable read data process data else if event is writable write queued data else if event is closed connection remove socket from socketset end end done done
IP堆栈负责处理哪些数据包到达哪个“套接字”的详细信息.从应用的角度来看,套接字表示可靠的有序字节流(TCP)或不可靠的无序序列(UDP)
编辑:响应更新的问题.
我不知道你提到的任何一个图书馆,而是你提到的这些概念:
>会话缓存通常保留与客户端相关联的数据,并且可以将该数据重用于多个连接.当您的应用程序逻辑需要状态信息时,这是有道理的,但它比实际的网络端更高.在上述示例中,会话高速缓存将被“进程数据”部分使用.缓冲池也是高流量服务器的简单且经常有效的优化.该概念非常容易实现,而不是分配/释放用于存储读/写数据的空间,从池中获取预分配的缓冲区,使用它,然后将其返回到池中.这避免了(有时比较昂贵的)后端分配/释放机制.这与网络并不直接相关,您也可以使用缓冲池.这些东西读取大块文件并处理它们.