各位高手,我对VB中的socket编程不是很熟,现有个问题向大家请教:server:接收数据后需要处理较长时间,根据数据量5-10s不等。
client:有多个Client向服务器连接,发送数据,发送后断开。
server端根据Client发送顺序来处理数据。我写了一些处理程序,发现server端的处理过程阻塞不住,数据收进来就触发DataArrival事件,我想让这些数据的处理按照收到的顺序逐一处理。想到有增加条件轮询判断的方法,但这样不是一个好办法,各位socket高手有什么好的方法?

解决方案 »

  1.   

    我没接触过这方面的理论,只谈点经验:
    做一个好的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也毫无问题。不光网络程序如此,其实很程序都可应用这种消息队列处理方式,对外来数据可以,甚至调用自己程序的一个过程,打开自己一个窗体,都可通过给自己发消息来实现。看似绕圈子,但这样做的好处,你可能只有真正用活了,才会明白。
      

  2.   

    现在取是由DataArrival事件触发的,大家有没有办法能自己控制去取socket通道内容的办法呢
      

  3.   

    没关系~你可以交给外部进程来处理!
    VC+VB的优势啊~哈哈哈!
    不过要处理10s还真有点让人担心你的在处理什么...怕怕
      

  4.   

    TO:bb2()
    因为现在你这个应用需要太量的运算,所以不能在程序内部来处理了.要调用外部进程来处理,完成后返回也好,直接动作也好,这要看你的应用了!
    10s...你在统计数据库吗?还是什么的?dataarrival事件只要有数据到达,不管怎样也不会暂停的!这是你控制不了的...因为控件也属于外部进程了!随非...动用sock的API~这个我不会了!网络蚂蚁里就有如此一个例子!具体是在下载了同名文件出现替换,改名,取消那个对话框的时候,暂停了~在winsock control那还有一个叫sockhandle的属性~可能可以用这个来与API互交!这就不清楚了
      

  5.   

    多谢大家帮助,我是在尝试用sock的api来实现了,看来只有这条艰苦的路了