用UDP,TCP的话,首先100K个连接就是个问题,参见C10K问题:http://www.cnblogs.com/fll/archive/2008/05/17/1201540.html
看了,看不懂.
@hexllo: http://blog.csdn.net/roen/article/details/1537545
简单的说,TCP是面向连接的服务,在发送报文前,客户端首先需要跟服务器建立连接,连接建立后,为了后续的报文发送,服务器还必须保持这些连接的状态。因此,当客户端数量巨大时,服务器在处理的性能上就会急剧下降。而UDP是无连接协议,因此适合这种一次性的报文传递,但是不能保证可靠性。
@Launcher: 你觉得有没有可能实现?1台机器同时接收10W个IP发来的东西 ...另外,如果用TCP的话,同一个监听端口,每接到一个客户端发来的消息之后,就会和这个客户端建立连接,而普通服务器系统,比如Windows server2003,最大连接数是255,那么超过这数之后,是不是要等之前建立的连接超时之后,才能处理后边的连接呢?看来TCP行不通,如果用UDP的话,同时接到10W个客户端的消息,在排除其他因素之后,和接收端相连的网线能否传输10W个IP发来的消息?会不会产生数据丢失的情况?或者数据全部传到接收端,等待接收端处理之前接收到的数据时,数据会丢失吗?
@hexllo:没测试过,你可以自己测试下。最大连接数不是255,不知道你从哪里看来的,可能你的理解错误了。理论上服务器可以启动65536个端口监听(由于部分端口被占用,总数会比这个低),我假设服务器启动了10个监听端口,每个端口接收10K个客户端连接,这就可以达到100K个TCP连接。我假设服务器有10个核心,那么每个核心可以负责一个监听端口,可以达到并行运行,但是我没测试过建立连接是否也能并行。所以,如果采用UDP的话,你同样可以在服务器根据CPU核心数来开辟监听端口数目,客户端可以分别向这些端口单播UDP数据包。
如果涉及到报文大小,也至少需要100MB的带宽才能同时容纳,除了网线,你还得考虑交换机等网络设备,当然实际的流量会比这个小,因为并不是同时达到。
UDP不是一个可靠的协议,所以包丢失是允许的。
看需求吧。如果是实时性要求高的,或者可靠性要求低的,udp。如果是可靠性要求高的话,tcp。至于楼上说得那个问题,影响更多的是你怎么搭建通信框架。怎么说呢,你单独几个线程专门去负责接数据,然后接到的数据放到内存池,至于内存池怎么弄,自己找资料看,自己写就行。后面就是处理的业务线程,消息队列,一个个自己慢慢处理。这个是接。发送也一样,业务线程要发什么,一个个放到发送队列里面去,然后底层的通信自己去对应的队列里面慢慢拿数据包往外面发,还有少用flush之类的。至于套接字设置成阻塞的还是非阻塞的之类的,看你自己需求吧。listen的那个api的第二个参数自己去调整下。
你觉得有没有可能实现?1台机器同时接收10W个IP发来的东西 ...另外,如果用TCP的话,同一个监听端口,每接到一个客户端发来的消息之后,就 会和这个客户端建立连接,而普通服务器系统,比如Windows server2003,最大连接数是255,那么超过这数之后,是不是要等之前建立的连接超时之后,才能处理后边的连接呢?看来TCP行不通,如果用 UDP的话,同时接到10W个客户端的消息,在排除其他因素之后,和接收端相连的网线能否传输10W个IP发来的消息?会不会产生数据丢失的情况?或者数 据全部传到接收端,等待接收端处理之前接收到的数据时,数据会丢失吗?