快过大年的时候还要问个技术问题

时间:2022-08-23 12:07:13
最近要做一个实时通讯程序,用一台电脑做服务器,处理大概50-100个终端发来的数据,采用的是UDP通讯。
服务器端的程序初步方案如下
1、在服务器上创建一Socket,采用基于Windows消息的异步选择机制,注册一消息响应函数负责接收数据。
2、同时启动50-100个数量不等的线程,线程数量视终端数量而定,每个线程负责一个终端。
3、主线程中的消息响应函数将接收来的数据放入接收队列。
4、由子线程从接收队列中分别取出属于自己终端发来的数据,处理完成后发还给终端。
各位技术达人,不知道此种设想可行否?有经验的朋友请给力一下。谢谢啊

8 个解决方案

#1


该回复于2011-02-09 09:58:42被版主删除

#2


UDP 不稳定,一般传正式数据,还是使用TCP保险。

#3


至于通讯协议,终端机已经固定是UDP协议了,俺只负责服务器上的实时通讯程序。

#4


用UDp控件,异步方式接收,不需要多线程;

#5


1.一个接收线程负责读socket数据到接收队列,一个发送线程负责从发送队列发送数据到socket,另外一个线程池中的若干个工作线程负责处理数据。

2.线程池中的每个线程从接收队列读数据,判断它是哪个client发过来的,处理后,写入发送队列。

3.没必要给每个client分配一个线程,根据请求的数据量,决定线程池中线程数量即可。如果处理过程只是cpu运算之类,不涉及与其他服务器的网络交互,或数据库操作,那么线程池中只需要一个线程即可,多个线程不但不会快,反而由于线程切换会导致更慢。这个要根据具体情况分析,测试。

#6


呵呵,果然不出 Maconel所料,单核cpu1.1G,我才开动10个线程后,程序响应终端的速度慢的不得了,后改成Maconel的方案,从目前测试的效果看,还算不错,我担心的是用Windows消息来读取缓冲区中的数据,这种方式能达到多大的并发量呢?

#7


引用 6 楼 hsujk 的回复:
呵呵,果然不出 Maconel所料,单核cpu1.1G,我才开动10个线程后,程序响应终端的速度慢的不得了,后改成Maconel的方案,从目前测试的效果看,还算不错,我担心的是用Windows消息来读取缓冲区中的数据,这种方式能达到多大的并发量呢?


并发量不大,而且不能是计算密集型的,300个以下适合。

#8


如果能达到300个,那足矣,散分了散分了。

#1


该回复于2011-02-09 09:58:42被版主删除

#2


UDP 不稳定,一般传正式数据,还是使用TCP保险。

#3


至于通讯协议,终端机已经固定是UDP协议了,俺只负责服务器上的实时通讯程序。

#4


用UDp控件,异步方式接收,不需要多线程;

#5


1.一个接收线程负责读socket数据到接收队列,一个发送线程负责从发送队列发送数据到socket,另外一个线程池中的若干个工作线程负责处理数据。

2.线程池中的每个线程从接收队列读数据,判断它是哪个client发过来的,处理后,写入发送队列。

3.没必要给每个client分配一个线程,根据请求的数据量,决定线程池中线程数量即可。如果处理过程只是cpu运算之类,不涉及与其他服务器的网络交互,或数据库操作,那么线程池中只需要一个线程即可,多个线程不但不会快,反而由于线程切换会导致更慢。这个要根据具体情况分析,测试。

#6


呵呵,果然不出 Maconel所料,单核cpu1.1G,我才开动10个线程后,程序响应终端的速度慢的不得了,后改成Maconel的方案,从目前测试的效果看,还算不错,我担心的是用Windows消息来读取缓冲区中的数据,这种方式能达到多大的并发量呢?

#7


引用 6 楼 hsujk 的回复:
呵呵,果然不出 Maconel所料,单核cpu1.1G,我才开动10个线程后,程序响应终端的速度慢的不得了,后改成Maconel的方案,从目前测试的效果看,还算不错,我担心的是用Windows消息来读取缓冲区中的数据,这种方式能达到多大的并发量呢?


并发量不大,而且不能是计算密集型的,300个以下适合。

#8


如果能达到300个,那足矣,散分了散分了。