现在要做一个程序。  用的WINSOCK控件数组。客户端大概20个左右  客户端通过WINSOCK给服务器端发送消息,服务器接收后将对应的处理结果返回给客户端  现在就是在考虑VB程序一般是单线程的,如果同时接收到多条消息,同时只能处理一个,那剩下后个是怎么处理的?  是不是需要自己将接收的消息进行排序做成一个队列依次交由程序处理?烦请各位前辈指点  另程序中有些结果可能需要通过WINSOCK将服务器端查询数据库的记录集传送到客户端,  想顺一下各位前辈,将记录集转换成BYTE数组的话传输有没有什么问题,或者各位前辈能否指点一下更有效的方式传输!  先谢大家了!

解决方案 »

  1.   

       自己顶一下在线等
       主要是WINSOCK怎么样传输记录集
      

  2.   

    VB的事件代码里面如果没有DoEvents,那么代码运行期间,不可能响应新的事件。
    也就是其余部分被阻塞住了。
    所以没有问题。考虑性能,还是用Java、Delphi或者.NET吧
      

  3.   

    建议使用Web Service而不是直接用套接字来传送数据。
    VB6下面可以用Microsoft SOAP Toolkits,非常简单,你可以Google下。
      

  4.   

    如果不是实时性要求高的需求,如QQ、WEB,就不要搞的那么麻烦,用C/S结构就可以了。如果追求相应速度,熟悉VB的话,用ASP好了。
      

  5.   

    控件数组中有一个Index可以区分控件元素呀。
    至于事件,可以看成每一个事件的产生都是独立的就可以了。
    还有,如果数据量比较大,如超出4K的数据,很可能会分次收到事件,这个即使不是控件数组也是一样的。
    所以要做好分步接收数据的处理,如:Type MyWSockReadType
       ReadSize As Long
       ReadCount As Long
       Bytes() As Byte
       '...             '还可以定义些别的东西来使用
    End Type
    Dim WSRead() As MyWSockReadType
    '...
    '这里处理好建立连接和关闭连接什么的过程,注意要处理好数组
    '...
    Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
        Dim RData() As Byte
        Dim RDataCound As Long
        '读取字节流数据
        Winsock1(Index).GetData RData, vbByte, bytesTotal
        '判断是否读了数据,主要是区别数组边界的定义过程
        If WSRead(Index).ReadCount = 0 Then
            ReDim WSRead(Index).Bytes(bytesTotal - 1)           '第一次读数据直接定义数组边界
        Else
            ReDim Preserve WSRead(Index).Bytes(bytesTotal - 1)  '多次读数据用扩展方式定义数组范围
        End If
        '用API函数 CopyMemory 将读到的字节流数据放到要整合数据的数组变量中
        CopyMemory WSRead(Index).Bytes(WSRead(Index).ReadCount), RData(0), bytesTotal
        '加地质,其实 WSRead(Index).ReadCount 可以不用的,可以直接用 UBound 识别数组范围,但是这样速度会快点。
        WSRead(Index).ReadCount = WSRead(Index).ReadCount + bytesTotal
        '判断是否已经读完了数据,通过协议里先设置好的 ReadSize 来判断
        If WSRead(Index).ReadCount >= WSRead(Index).ReadSize Then
            '完成接收任务
            WSRead(Index).ReadCount = 0
            WSRead(Index).ReadSize = 0
            '将数据写到 C 盘上
            Dim fs As Integer
            fs = FreeFile
            Open "C:\Sock" & Index & ".dat" For Binary As #fs
            Put #fs, 1, WSRead(Index).Bytes
            Close #fs
        End If
    End Sub
      

  6.   

    1、vb下的WINSOCK处理20多个连接请求太轻松了2、是不是需要自己将接收的消息进行排序做成一个队列依次交由程序处理?
       不用,winsock会自动排队,这块会有点操作技巧,自己摸索也用不了多长时间3、另程序中有些结果可能需要通过WINSOCK将服务器端查询数据库的记录集传送到客户端
       查询数据库操作不是winsock做的4、将记录集转换成BYTE数组的话传输有没有什么问题
       本人都是直接传输的字串,没用过byte
      

  7.   


    如果由客户机直接连接服务器的数据库那么数据库连接由客户端创建会不会产生安全性的问题?
    ————————————————
    3、另程序中有些结果可能需要通过WINSOCK将服务器端查询数据库的记录集传送到客户端 
      查询数据库操作不是winsock做的 不是让WINSOCK是操作数据库。只是想让WINSOCK将服务端操作的结果记录集通过WINSOCK传送到客户端。有什么的方法?
      

  8.   

    其实你要做的只是个三成结构的网络数据库服务而已。
    如果采用Winsock自己做,那么主要就是逻辑上的问题还有你如何定制你的通讯协议的问题。
    如:
     1、客户端连接服务器端
     2、服务器端接受连接请求,同时创建新的Sock控件组进行侦听
     3、C => S    COM: SQL  客户端向服务器端发送命令,如"SQL"
     4、S => C    COM: SIZE 服务器端收到"SQL"命令后向客户端发送"SIZE"命令大小请求
     5、C => S   Data: 128  客户端将要发送的字符串字节数(128字节)发送给服务器端
     6、S => C    COM: OK   服务器向客户端发送准备完成的命令,并将得到的将要接收的数据大小存储
     7、C => S  Bytes: Data 客户端向服务器端发送要查询的SQL语句内容
     8、S GET Bytes         服务器收客户端的数据,直到数据达到预定的数据大小,可以参考我8楼说的
     9、S => C    COM: Count 3  服务器向客户端发送查询到的数据记录数3条
    10、C => S    COM: SIZE 客户端收到数据记录大小后请求第一条数据的大小
    11、S => C   Data: 1024 服务器整合纪录里所有的字段到字节数组(待分割符号)然后发送数组大小给C端
    12、C => S    COM: OK   客户端向服务器发送做好接收准备的命令,等待服务器发送数据
    13、C GET Bytes         客户端收服务器的数据,直到数据达到预定的数据大小,可以参考我8楼说的
    14、C Execute Process   客户端接收完成后可以将数据结果放到集合中共程序适用.上面知识举例Ado数据集对象的Open方法的过程,还可以在设计 MovNext 方法、Execute 方法...等等过程,这样就可以向ADO一样用了。
      

  9.   


    没关系,Winsock 不是单线程的,它会进行队列处理。实际上,不可能真正有“同时”发生。在你的网线上,一个时间只能有一个用户的包发过来。关键的问题,是你的服务程序处理的速度如何。
      

  10.   


      感谢楼上提的意见学习了  晚上另开贴请楼上几位接分  因为程序比较急,所以暂时直接用客户端创建到服务器数据库的连接来进行操作  准备再根据SupermanKing (人类)提供的思路尝试一下用WINSOCK来传输  另外还有个问题想请教一下大家,下面三种方案  1.WEB方式 用ASP做成网站。客户由浏览器查询  2.使用客户端直接连接远程MSSQL数据库操作  3.客户端通过WINSOCK发送消息至服务端。由服务端执行SQL后返回结果给客户端  这三种方案在服务器环境相同的情况下哪一种效率最高?    
      

  11.   

    晕倒~我在编写一个C/S程序的时候,就是因为VB是单线程,而导致失败的因为很多用户发送数据过来的话就无法处理了,看到了3L说的,如果不使用DoEvents则可以进行列队,但是我不得不使用DoEvents,因为有时候要发送一个数据,数据并不会立刻发送,而是继续存放在缓冲区,系统会自己找个合适的机会在发送,弄的我明明登入了一次,但是服务器就是收不到登入包,IED断点调试却没问题,哎,加上DoEvents就可以了
    我现在在学vb.net用多线程来设计C/S程序,很棒!互相无任何干扰,速度快
      

  12.   

    http://www.m5home.com/blog/article.asp?id=169这也是WINSOCK控件做的多客户端传输代码,曾经做过同时接收五六个文件的测试,没啥问题,应该有点参考价值:)