一个服务器应用程序一般来说只通过一个端口来与多个客户端“同时”进行通信,比如一个web应用程序一般来说通过80端口来和多个客户端通信,那么是如何实现一个应用“同时”和多个客户端通信的呢?
1.这里的“同时”我不理解是一个服务器应用真的能够同时和多个客户端通信?还是实际上同时只有一个客户端能够和服务器应用通信,而因为单个连接通信时间较短造成一个服务器应用和多个客户端“同时”通信的假象?
2.在socket的层次上是否可以这么理解:服务器应用是真正能做到同时和多个客户端通信的,端口相当于一个导线,这条导线上连接一个插板,插板上有很多插座(server socket),这样,多个插头(client socket)就可以同时插在一个插板上。完成多个客户端“同时”和一个服务器应用通信?
2015.11.28更新
3.每个应用只能通过一个端口来和客户端通信,那么,大型网站或者im服务器是如何保证海量客户端和服务器应用的稳定、高效连接?
2015.11.29更新
感谢大家的回答!我其实更希望得到一个socket层面上的回答(一个服务器程序如何通过调用socket接口来实现与多个客户端的高效通讯?)。我现在还没到理解socket实现机制的层次,请大家谅解。
我猜楼主可能不清楚 socket 和 端口以及TDP/UDP connection 这些之间的关系以及操作系统里面的对应.
拿*unix操作系统举例:
socket 在操作系统里面是一个文件描述符, 和普通的文件的文件描述符一样,可以通过系统调用 read(), write()进行读取和写入数据.
每一个socket 其实有几个重要的参数, 本机ip,本机port,对端ip,对端port,以及协议等, 这几个通常要是unique的, 操作系统才不会把socket 和 socket 之间搞混.
服务器端的程序,一般会把socket 和某一个ip,port 端口bind 起来, 这样构成了一个特殊的socket, 这个socket 没有对端ip和对端port, 只有本机ip和本机port.
你可以把这个socket 看成是一个特殊的文件(好比登记表), 当有新的连接进来的时候, 都可以通过 accept 系统调用让操作系统接受一个新的连接, 同时返回一个新的socket, 这个socket 是绑定在(本机ip,本机port,对端ip,对端port) 这个上面的, 也就是对应了一个unique的连接.
然后你可以拿着这个新产生的socket 进行写入和读取等操作(因为它是一个文件描述符). 那个用来listen的socket 和这个新的socket 是不相关的,在操作系统内部也是分开的,会有各自的缓冲区等.
至于你提出的问题: 如何用一个端口来与多个客户端“同时”进行通信? 我粗浅的理解, 端口只是在操作系统中用来区分一个连接和另一个连接的其中一个项(剩下的还有本机ip,对端ip,和对端port), 因此和真正的通信并无太大关系, 你一定是把它想象成了和网卡的出口类似的东西.