我使用VB6\WINSOCK控件、TCP协议开发了一个OICQ的聊天软件,WINSOCK控件是支持多线程的,但是如何使服务器同时接收多个客户断的请求(包括连接,信息转发),这里我使用了FOR循环因为服务端要从上线用户列表中找到要此用户,但是当这个FOR循环没有执行完毕的时候,服务器又接到了下一个用户的请求,又进入了一个FOR循环,这时上一个循环就会被终止,可能导致上一个信息发送失败。VB6是单线程的,除了使用“多线程”外,完全依靠WINSOCK控件的多线程,能否解决上述的问题,或者您有更好的解决方式或办法?请赐教!非常感谢!!A发送信息给B,A将信息发送给服务端,服务端再将信息转发给B,以下是服务端的代码片段。我担心的是如果此FOR循环还没有执行完毕,服务端又接收到一个请求,那么此FOR循环在没有找到B用户的时候就可能被终止,开始了一个新的FOR循环,导致B将收不到A的信息。有没有一种办法可以解决此问题!!!最好不使用多线程,当然如果您有更好的方法,请赐教,谢谢!!
For u = 0 To intMax '查找B用户
If ServiceSocket(u).State = 7 Then
If UserInfo(u).InUse = True Then
ServiceSocket(u).SendData "信息"
DoEvents
End If
End If
Next u
For u = 0 To intMax '查找B用户
If ServiceSocket(u).State = 7 Then
If UserInfo(u).InUse = True Then
ServiceSocket(u).SendData "信息"
DoEvents
End If
End If
Next u
Dim Socket As Socket
'由新装载的控件接受客户的连接请求
On Error GoTo err
If Index = 0 Then
Set Socket = sckSocket(sckIndex)
Socket.Close
Socket.Accept requestID
DoEvents
End If
Exit Sub
End Sub
或者直接写doevents也行
另外,不要采用for的方式,而是
dim sck as winsock
for each sck in winsock1
sck.senddata "sysy"
next sck
set sck=nothing
用for in的方式,如果某客户短开的时候unload了winsock(2)就会出错. 比如1,3还存在的时候
cpio(就这么简单)
zyg0(影子(转了1圈,我又回来了)
Surpass(网络飞狐) 我的程序是在他的基础上改的,http://www.cn700.com/Down_144/20041023141818.html,请给位下载后看一下客户端和服务端的程序,看看是否会出现我说的问题,如果存在应该怎样更改?
循环后要加上DoEvents,或退出所有调用前,不再有SendData就可以了。
我使用的是winsock控件数组,我给多人发送信息的时候用的是循环,请问在winsock(1).SendData "111"
winsock(2).SendData "111"之间是否增加Doevents?
不可相信
服务端如果用控件数组,在vb中,它自动提供多线程
两次的for不会交叉的
当然,最好不要在for里面出现doevents
怎么同时发都是没问题的
winsock本身有缓存,会解决着个问题的
其实,你就是害怕函数Public Function Message(UserCommand As String, Index As Integer)
会出现你说的问题
其实,你的担心是多余的
一个请求如果在没有处理完,也就你说的,for还没结束,又来了一个请求,这是是否会停止上一个请求的for呢?!
并不会,后面来的请求,winsock会自动给它们一个线程处理,当前线程照样处理第一个请求,直到处理完
其实,这其中winsock已经把你的问题考虑进来了,当然,也不排除高并发量时的信息丢失,这个是因为winsock的缓存不搞,如果你的用户量不大,信息丢失一般不会发生
如果你的用户量很大,象qq这样的超级服务器还是会发生的
如果你的用户量很大,象qq这样的超级服务器还是会发生信息丢失的
说明:qq是自己控制线程的<它的优点也在它的高并发>用户多了,什么事情都会发生
以前的qq还是会丢失数据的,现在好些了
>>并不会,后面来的请求,winsock会自动给它们一个线程处理,当前线程照样处理第一个请求,直到>>处理完错了!循环虽然不会停止!但winsock的DataArrival事件却不断发生.而你却还在循环里,不能取得数据!也因为winsock内有缓存,数据就积压在那了!而当你从循环里跑出来的时候,上一个DataArrival事件已经是N年前的事了!也就是说,Index被打乱了!
很难想像,04发的数据,到05才收到是怎么一回事!哈哈~夸张了点!
多线程有多线程出现在原因.不要企图打破,因为这是科学.
担心数据积压?先不考虑一台机器能不能容下10000个人在线,就算可以吧(反正我没敢想像过)。10000个人同时发消息任何机器都会堵呀(有这种可能吗?)再多线程,在CPU中还是一个个排队处理。
一次循环给10000个人发消息要多长时间你试了吗?会很长吗?0.5秒钟之内,肯定结束!这种延时对网络通讯有影响吗?其实服务器1秒内给50000个客户端发消息也是能做到的。理论中也有出现大规模并发的概率之说呀,为什么这个你不借助于理论呢?总感觉你似乎在做一个能与QQ竞争的超大型系统,想在一台服务器上用VB实现QQ的所有服务器的能力。这一点在“理论”上是达不到!
您说的这一点我明白,但是“一次循环给10000个人发消息要多长时间你试了吗?会很长吗?0.5秒钟之内,肯定结束!”如果处在10000位置上的客户等待服务端处理他的请求,可能是10000*0.5=5000秒,这样的延迟太可怕了。我目前就是这个问题困扰我!! 如果我将vb6服务端的程序改写成vb.net是否可以解决我的问题?
您说的这一点我明白,但是“一次循环给10000个人发消息要多长时间你试了吗?会很长吗?0.5秒钟之内,肯定结束!”如果处在10000位置上的客户等待服务端处理他的请求,可能是10000*0.5=5000秒,这样的延迟太可怕了。我目前就是这个问题困扰我!! 如果我将vb6服务端的程序改写成vb.net是否可以解决我的问题?
==================================================================
vb的winsock的苏组的index是1个inter 类型,只支持32767个用户,因此不会出现,也不能支持50000用户,要想支持那么多,只有采用udp
不用担心什么延时,只要配置高的网络带宽和机器性能就行了
根本不存在无锋升级,那只是微软的神话,不可能的,你几乎代码都需要从写
。结果是否会产生严重的客户等待信息返回(延时)?我的程序原形如下:http://www.cn700.com/Down_144/20041023141818.html
vb保证3000-5000同时在线应该没问题
1、Tcp连接的服务器不太可能支持到10000的;
2、能有几千个客户,一般不会明显感觉到延时的;
何况别人QQ给你发来的消息,可能也是几秒前就送到服务器了呢,排队了几秒才发到你这的,网络传输有点延时是很正常。设计时考虑一点误差就够,没你想像那么严重,凭空想像写程序,这种习惯很多不好。总之:你这种担心是多余,要相信,CPU远比你想像的要快得多!你从1数到10000可能要10000*0.5=50000秒,但电脑会在你还没张口前就办到了。
只要用户没有500以上同时进行连接请求 winsock应该没问题 维持长连接3000也不成问题
消息广播如果用的地方太多 可以考虑udp作为补充 凡是udp发过去 没回应包的 就再用tcp发一次就可以了 UDP可以用组播嘛