300分在线等!在做(TCP/IP)服务器程序中所遇到的難題(希望有经验的人士一些解决方案)(200分)

  • 主题发起人 主题发起人 wx_ham
  • 开始时间 开始时间
关键是你还是需要在不同客户间切换,而只有有限几个端口可以映射,很耗时间的。

干脆做成主页形式吧,根据不同的id,在asp根据session里面读不同的内容,客户端读下来再处理。
优点:不用再费心思去管资源分配了,一个网站同时1、2000人在线都是很轻松的事情,而我们要手工做到这样的效果,那就相当于开发一个iis吧?;
缺点:客户端没法提交数据,也不是没法提交,就是一提交,慢得要死就是。

歪注意,说说就算啊。

能描述数据的频率,谁发给谁 等其他的详细情况吗?

还有 双线跟端口数没关系吧?只要允许,你所有端口都映射到你服务器上应该没问题的啊!
 
to jenhon
我发现你的思路很广嘛。呵呵
用户是需要经常提交数据的,
而且用户对某一对象的操作需要向所有的用户发送。


我本来多线程是在需要广播的时候创建多线程,来发送用户数据,发送完了后线程注销。现在改成了:用户登陆和下线的时候来维护这个线程,线程发送完了以后是挂起,而不是注销,一会儿测一下效果再说!
 
你的端口重用不允许你挂起啊?你挂起了一个线程,这个端口也就占用住了啊?
如果你能挂住,说明你服务器还是允许多开端口?
还是你线程是单方面由客户端保持,等服务器切换到这个对应客户,再激活这个线程?要不,如果挂住了,这时候如果这个客户有提交需求,那么服务器会出错的啊。

学习ing....
 
昏倒,我在创建线程的时候将之挂起:Create(True);
然后在需要的时候唤醒:Resume();
我想线程执行完毕后再将线程挂起,等待下一次的操作:
Thread.execute;
begin
**********线程处理*********
suspend;//线程挂起,等待下一次的调用
end;
不曾想:下一次再Resume唤醒的时候,调用不了程序了
 
同时通知600多用户,这个用tcp确实耗时间啊。
客户端也是自己开发吗?
是的话,可以采用p2p方式。你通知60个就是了,让它们再去通知余下的用户,一传十,十传百,哪怕6千个客户端也快速搞定啊。
 
P2P......P2P加速是需要一段时间的.....那600个用户可就不止4秒的等待了....
 
P2P的技术还是没有研究过,但是我想对客户端和服务器端稳定性要求会更高,
而且P2P中TCP链数的选择也是很重要的。
因为只有公网的用户才可以做Server端的呀。
 
P2P 谁来保证跟服务器说已经收到信息啊?

lz的应用场合可能很严肃,没收到就没收到,谁收到了也要说的。

看来只能在增加端口上想办法来提高速度了。
 
分布式让几台计算机来完成任务
 
to:andyzhouap98111
这是一个办法,但是一台服务器只能支撑200个左右的用户是否有点太少了?
都是QQ服务器是用UDP协议,服务器压力不大,
但是根据很多用户的经验来看:Internet走UDP广播似乎不太可行。
那么QQ又是怎么实现的呢??
 
qq也不是用广播的,广播只适合局域网。
另外早期的qq是采用udp协议。
现在qq有钱了,服务器强大了,也支持tcp登陆。
在登陆失败的时候qq会显示一个服务器组的链接测试报告。
上面列出了十几个个服务器(集群?)域名,有udp的也有tcp的。
像楼主这个情况,现在改来不及了,否则用udp效率会高很多。
建议楼主找一下时间瓶颈在哪里,是耗时在链接的建立上还是耗时在数据的传输上?
抑或等待客户返回数据的步骤消耗了大量时间?
 
我认为瓶颈在于建立连接吧,600台机子,3秒就都传好了,意味着建立一个远程连接最多需要5毫秒,我都觉得够快了。
主要是模式不好,好不容易建的连接,建了又断(赶去连接下一个客户端),断了又建,没有效率啊。

我还是保留我的建议,增加端口数,一台机服务器600个端口是很容易、轻松的事情,何乐而不为?如果没有多端口传送,我想qq服务器再多也不够用吧?1台机可是有6万多个端口呢。
其实很简单的,客户端不用改,就改服务器端的就行。

改硬件设置吧,楼主说的“走双线”不是很理解,双网卡,一内一外?还是双ddn?
 
接收楼上两位的建议,我先查一下时间主要花在什么地方。
现在我模拟了200个用户测试的情况来看,在数据传输峰值时客户端(5秒收不到服务器返回的数据即再次发送)基本发送两次命令。才会从服务器返回。
而且这个时候服务器的CPU占用率也只有30%左右,网络占用率也只有5%左右,所以我觉得程序本身肯定也有问题。
我先研究一下自己的程序再上来和各位聊!
也希望能够继续关注。
 
楼主的服务器能不能借测试一下呀,看看双线的效果怎么样?请联系QQ:6657711[:D]
 
to:jenhon
我所说的走双线是这样的:
用支持两个入口的路由器(一个口接网通的,一个口接电信的),服务器的线从路由器接入在后面组一个内网。所有的发送到服务器的数据,所谓的IP地址其实是路由器的IP地址(在服务器上做端口映射)
 
>>来自:hs-kill, 时间:2006-6-19 18:10:02, ID:3475413
>>NONO 我所谓的等待是指TCP的3次握手。。。无论是否阻塞都需要等待握手成功才可以发
>>送数据
>>
>>UDP比TCP快就快在不需要握手
严重同意! TCP之所以慢,就是因为要握手,还有数据确认上。
一般的ADSL的的延迟5-25MS之间,你可以假设一下,发送几百节字要一个数据包的话,发到对方电脑要5-25MS,之后对方还要发一个数据包给你,确认数据包没有出错,这样也用了5-25MS,之后到下一个用户……如果中途丢包,或者网络延迟再高点的话会怎么样?

而改用UDP的话则不会出现这样的问题,包发出之后不用等待对方的响应,直接发给下一个用户了。但是它是不可靠的,

如果楼主说改用多线程后3S内搞定,可以算一算, 其实已经够快的!
3000MS/600=5MS
5MS/2=2.5MS
平均每个月户单程延迟才2.5MS,是相当快了吧。
 
终于有个明白人了。。。哎

我早就说了,楼主总是不信。。。。
 
呵呵,楼主碰到的问题显然是做法的问题。
多线程是不二法门。
最常见的是做一个扫描器,对一大段IP扫描,如果没有多线程,一个一个阻塞在那里等到超时,绝对没人用。
计算一下扫一个b段根本不可忍受。
所以,自己写线程,就可以解决了。
 
>>来自:VictorWoo, 时间:2006-6-22 18:04:25, ID:3478745
>>呵呵,楼主碰到的问题显然是做法的问题。
>>多线程是不二法门。
>>最常见的是做一个扫描器,对一大段IP扫描,如果没有多线程,一个一个阻塞在那里等到>>超时,绝对没人用。
>>计算一下扫一个b段根本不可忍受。
>>所以,自己写线程,就可以解决了。

如果硬要用TCP的话, 多线程的确是不二的法门,至于用多少个线程,楼主可以慢慢测试。那个强的CPU,应该同时开个几百个不成问题吧。还有最好多点用静态分配资源,速度也快,也不怕资源泄漏。
 
多个线程就用线程池ThreadPool了。Indy都封装好好的了。Socket的估计得自己写线程池。如果为了完成项目的话先不调度线程池。后期优化性能的时候再加代码
 
后退
顶部