各位高手,我对VB中的socket编程不是很熟,现有个问题向大家请教:server:接收数据后需要处理较长时间,根据数据量5-10s不等。
client:有多个Client向服务器连接,发送数据,发送后断开。
server端根据Client发送顺序来处理数据。我写了一些处理程序,发现server端的处理过程阻塞不住,数据收进来就触发DataArrival事件,我想让这些数据的处理按照收到的顺序逐一处理。想到有增加条件轮询判断的方法,但这样不是一个好办法,各位socket高手有什么好的方法?
client:有多个Client向服务器连接,发送数据,发送后断开。
server端根据Client发送顺序来处理数据。我写了一些处理程序,发现server端的处理过程阻塞不住,数据收进来就触发DataArrival事件,我想让这些数据的处理按照收到的顺序逐一处理。想到有增加条件轮询判断的方法,但这样不是一个好办法,各位socket高手有什么好的方法?
做一个好的server端,结构设计很关键,最常用的就是消息队列方式,这不是什么新鲜东西,整个Windows系统,几乎就是建立在此基础上的。对于client端的数据,你可利用一个集合保存,
sub winsock_DataArrival(..)
winsock.getdata msg
col.add msg
end sub集合就是消息队列,用一个定时器在后台,以先进先出的方式,逐条处理集合消息
sub Proc_Timer()
if col.count>0 then
on error goto fail
Proc=False
msg=col(1)
col.remove 1
....处理Msg
fail:
Proc=True
end if
end sub这样,你在处理过程中可大胆使用Doevents,根本不用担心数据处理顺序被打乱。
Proc.interval尽量定在100以下,很多人认为interval过小很占资源,建议去试试再说,我的经验是定在20-30也毫无问题。不光网络程序如此,其实很程序都可应用这种消息队列处理方式,对外来数据可以,甚至调用自己程序的一个过程,打开自己一个窗体,都可通过给自己发消息来实现。看似绕圈子,但这样做的好处,你可能只有真正用活了,才会明白。
VC+VB的优势啊~哈哈哈!
不过要处理10s还真有点让人担心你的在处理什么...怕怕
因为现在你这个应用需要太量的运算,所以不能在程序内部来处理了.要调用外部进程来处理,完成后返回也好,直接动作也好,这要看你的应用了!
10s...你在统计数据库吗?还是什么的?dataarrival事件只要有数据到达,不管怎样也不会暂停的!这是你控制不了的...因为控件也属于外部进程了!随非...动用sock的API~这个我不会了!网络蚂蚁里就有如此一个例子!具体是在下载了同名文件出现替换,改名,取消那个对话框的时候,暂停了~在winsock control那还有一个叫sockhandle的属性~可能可以用这个来与API互交!这就不清楚了