C# 即时通信 socket 多线程 长连接

pcweekend 2011-04-24 02:51:52
我做了这样一个程序: 执行端D《======》服务端S 《======》 控制端C
做如下工作
执行端D有问题要处理时通过socket发送到服务端S,由服务端分配到空闲的控制端C。控制端处理完成后发送服务端S,服务端S保存记录,并且把处理结果发送回执行端D。
由于数据比较平凡,大约1分钟一次,我采取的是长连接。服务端给每个客户端开一个线程来单独处理。当两边的客户端合计到500台后,执行端便很难再连接上了。各位大神指教下是什么问题啊。

另外如果我用WCF技术的话可不可以实现这个处理?
...全文
407 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
窗户纸 2011-05-02
  • 打赏
  • 举报
回复
我很好奇楼主的服务器的性能如何,多少处理器,主频,内存什么的,会不会用大些的服务器及更多的内存,连接数会多些
pcweekend 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 luminji 的回复:]
服务端给每个客户端开一个线程来单独处理。

你这样做,是最最错误的做法。

区分计算密集型和I/O密集型的多线程应用场景

I/O密集型操作。硬盘、网卡、声卡、显卡等都是。CLR所提供的异步编程模型就是让我们充分利用硬件的DMA功能来提高CPU的利用率。

一个在大多数情况下正确的技巧是,凡是FCL中类型提供了类似BeginDoSomething方法的,都建议使用这个异步调用来完成……
[/Quote]

我搞错了,是异处理的,并不是没个端一个线程.
pcweekend 2011-04-26
  • 打赏
  • 举报
回复
不好意思,并不是每个客户段一个线程, 是异步socket. 是Server2003 下运行,试了好久估计500个长连接,是极限了.
codingtaoist 2011-04-24
  • 打赏
  • 举报
回复
不要每个客户端一个单独线程。
你可以开少几个线程,排队处理请求。如果你的请求数量无法控制,你可以设定一个可能超过计算机的阀值,超过阀值返回错误,让客户端延时重发;或者你请求落地,比如放到windows消息队列里,启用线程从windows消息队列里取出请求处理。
窗户纸 2011-04-24
  • 打赏
  • 举报
回复
异步处理的可以在服务器上配置一个线程专门用于接收网络请求,一个或多个线程专门处理网络请求,一个线程专门发送请求的结果,
客户端也是一个线程发送请求,一个线程接收请求。n个线程处理请求,处理请求的线程在发出请求后通过manuresetevent或者lock的方法进行等待,收到回复后进行处理。

有关长连接数量的话题,我看了一些国外的帖子,由于winxp的限制,长连接数量不能太多,在win2003上根据服务器性能和业务不同,会有不同,但能达到1000或2000是不容易的。但我没有途径实际测试,如果有人有这方面的测试结果,倒是很有意思。
  • 打赏
  • 举报
回复
服务端给每个客户端开一个线程来单独处理。

你这样做,是最最错误的做法。

区分计算密集型和I/O密集型的多线程应用场景

I/O密集型操作。硬盘、网卡、声卡、显卡等都是。CLR所提供的异步编程模型就是让我们充分利用硬件的DMA功能来提高CPU的利用率。

一个在大多数情况下正确的技巧是,凡是FCL中类型提供了类似BeginDoSomething方法的,都建议使用这个异步调用来完成多线程编码,异步在后台调用线程池线程完成调度,最大化的节约了系统的性能。

开了500个线程,再加上你代码中的其它不合理使用内存,估计系统分配给你的2G线程栈就用光了。所以何来性能所言。

使用异步后,采用线程池管理,何止2000个,只要你数据发送频率不大,带宽吃得消,翻倍也是莫有问题的。

建议你看看异步和线程的区别。
pcweekend 2011-04-24
  • 打赏
  • 举报
回复
服务器socket 是异步作业。真的没油水可挖了?我听别人说可以2000多个
窗户纸 2011-04-24
  • 打赏
  • 举报
回复
WCF的速度和效率只会更慢,它底层用的是XML传输的,不过你每台长连接500个已经不少了,再挖掘一下可以看看服务端在处理数据时是不是异步操作的,如果这里没有什么油水可挖,就得考虑使用负载均衡的方式,即建立一个分配任务服务器,根据各运行服务器的业务队列长短分配客户端请求了。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧