日期:2014-05-18  浏览次数:20893 次

关于c# socket服务器开发问题,求高手指导!
最近用C#做一个socket项目,现在服务器可以采用两种方式,
第一种是多线程加同步监听的方式.就是每个socket创建一个thread用socket.receive()监听接收数据.
第二种是异步监听方式,就是用socket.beginreceive()和socket.endreceive()监听接收数据.

我做测试的时候是这样的.
写一个客户端.客户端中for循环向服务器端建立socket连接,建立好后就发送循环数i.
并保持socket连接不断开.
for(i=0;i<max;i++){
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(txtIP.Text), Convert.ToInt32(txtPort.Text));
s.Connect(endPoint);
s.Send(encoding.GetBytes(i.ToString()));
}
服务器端就只是监听接收客户端发送的数据并记录.

用第一种监听方式,服务器大概可以建立1700个socket正常接收数据.超过1700个以后.服务器端只能接收到1500多个数据.
并且这1500多个数据不连续,比如可能发送2000个,1600没有收到,但是1700却收到了,客户端这边的socket.send()也没有报异常.然后再用服务器未接收到数据的socket连接重新单独发送一条数据,服务器可以正常接收到.

用第二种监听方式,服务器可以建立超过4000个socket正常接收数据.(超过4000个后客户端的程序运行着就死了...手头也没有多台机器进行测试,就一台做服务器一台做模拟客户端).

请问:
1.为何第一种监听方式会出现那种情况?
2.第二种监听方式是不是也会有socket连接上限,如果有是多少?
3.单台PC机做socket服务器最大并发socket连接数是多少?
4.出现这种上限的情况是与编码不正确有关还是服务器机器的硬件配置有关?
5.两种监听方式哪种更优异点?有没有比以上两种更加优异的监听方式?

------解决方案--------------------
1. 第一种方法开了太多线程,很容易负荷过度
2. 没有见过最大值,测试过 5w ,没有问题
3. 没有见过单台 PC 的最大值。但是考虑到还有后台的业务逻辑,估计不可能达到这个值。
4. 应该跟硬件有关。
5. 第一种方法太烂,服务端不应该采用。 听说 Socket.ReceiveAsync 方法更高效。。不过没有试过。
------解决方案--------------------
服务端采用线程池+异步方式,如果每个 socket 连接上来都开一个线程,你的服务器是受不了的。纯异步,一般情况下5000个socket就开始难受了。
QQ那种估计应该是使用服务器集,是很多台服务器共同提供服务的,而不是单一服务器。
------解决方案--------------------
个人理解有几种方式
1 独立线程
2 异步轮训
3 IOCP
beginXX endXX是基于IOCP方式的 即完成端口模型(最强大的IO模型,理论上是最高效的方式)
也可以自己实现IOCP 但需要调用系统API
有个产品叫ESFramework的 要收费 博客园有博客的 但把核心捂得严严实实 生怕别人学了去

------解决方案--------------------
你听过云服务了吗,还有就是QQ的服务器,没接触过,但是这种大型的服务器不是单台服务器跑业务,他有一个大型的服务器集群,每台服务器都有服务器业务,并且有大型的负载均衡服务器,会把所有访问平均分配到可以运行的服务器上,还有就是他的服务器不是在同一个楼内,会建立多个异地分中心,他们的机房都整栋楼都是,比不了啊。
如果你跑这种小的程序,访问量要求不高的,你可以使用单台服务器做,数据库挂一个磁盘阵列,像你这种访问量应该有个配置高点的服务器就搞定了,问题不大。但是要保证你服务器程序没问题,如果服务器端没写好,可能一个程序就给服务器跑死了,硬件在好也白扯
------解决方案--------------------
探讨

1. 嗯,第一种我也认为是线程太多了.不过可以简单说一下造成这种测试结果出现的基本原理么?
2. 请问你是用什么方式测试的?
3.4. 做如腾讯QQ服务器那样的大型服务器,要保持几十上百万用户在线是怎么弄的?只是搞一个硬件配置超级牛的主机做服务器就可以了么?
5. 第一种方法很烂么.怎么我在网上搜索资料还看到别人推荐用第一种.http://zhidao.baidu.com/question/147502750.html