服务端程序采用 winsock 控件数组(使用TCP协议),多个用户(例如10个)同时发送请求给服务端程序,服务端程序是否可以同时响应10个用户的请求?winsock 控件是多线程吗?如果 winsock 控件数组是多线程,如何写程序才可以作到同时处理多用户的请求?

解决方案 »

  1.   

    MultiLink的WinSock Server程式我们要先有一个观念,在VB中,1.一个WinSock 控制项(当Server)只能连结一个Client端的需求,所以Server要变成可多重
        连结,要有多个WinSock控制项,我们也可以使用Load 指令来动态产生
    2.Server端必须设定好一个Local Port 当作其Listen的Port,所有Client端的RemotePort要
       指定Server 当Listen的Port Number,以本例来说,我设定3128当作Server Listen的
       Port,而我的程式中有一个WinSock Control (Winsock1(0))专门做Listen的动作。在本
       例中,我只允许有4个Cllient同时连上来,所以我在Form Load时,便动态产生4个
       WinSock ,含Listen  的那一个一共5个WinSock Control。
    3.在Server端,如果ConnectionRequest Event产生了,代表有Client端提出需求,这时
       候,我们要选取一个没有使用的WinSock Control来和Client连。
    4.我们在Client中,设定LocalPort = 0 代表会选取一个空着的Port来和Server的Port来连
      在Server中   Winsock1(i).Accept requestID 便会自动为我们做这件事;这时,我们会看
      到Server端的会Assign一个RemotePort,而Client也会Assign一个LocalPort,这次的连
      线便是透过这组连线管道来做该程式请将Client的程式做成.Exe再来重覆行,且Server的程式同时也要执行,当Client
    端的Text1.Text = "Close" 来送给Server时,告知Server该Connection 可结束
    其他相关的知识请查Help或其他书注: GetData方法 的第一个叁数 :如果传回的资料是String则宣告成String,若告成Variant
       在VB环境下没问题,但变成.exe後会有错(Automation Error);当然,若传的是Binary
       的资料,那就使用ByteArray来做
    '以下是Server端程式,需一个ListBox,一个WinSock控制项
    Option ExplicitPrivate Sub Form_Load()
    Load Winsock1(1)
    Load Winsock1(2)
    Load Winsock1(3)
    Load Winsock1(4)Winsock1(0).LocalPort = 3128  '设定Listen的Port是3128,请自行改成您的电脑没冲突的号码
    Winsock1(0).Listen
    End SubPrivate Sub Form_Unload(Cancel As Integer)
    Dim i As Long
    For i = 0 To 4
       Winsock1(i).Close
    Next
    Unload Winsock1(1)
    Unload Winsock1(2)
    Unload Winsock1(3)
    Unload Winsock1(4)
    End SubPrivate Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    Dim i As Long
    For i = 1 To 4
       If Winsock1(i).State = sckClosed Then
          Winsock1(i).Accept requestID
          List1.AddItem "Local Port=" + Str(Winsock1(i).LocalPort) + " RemotePort = " + Str(Winsock1(i).RemotePort)
          Exit For
       End If
    Next
    End SubPrivate Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    'Dim mydata As Variant
    Dim mydata As String '注:如果传回的资料是String则宣告成String,若告成Variant
                                          '在VB环境下没问题,但变成.exe後会有错(Automation Error)
    Winsock1(Index).GetData mydata, vbString
    List1.AddItem "From Socket" + Str(Index) + "  " + mydata
    Winsock1(Index).SendData "WinSock" + Str(Index) + "Reply"
    If mydata = "Close" Then
       Winsock1(Index).Close
    End If
    End Sub '以下是Client端程式,需一个ListBox,一个WinSock控制项,三个Command Button
    '与一个TextBox用来传资料,
    Option ExplicitPrivate Sub Command1_Click()
    Winsock1.LocalPort = 0 '以便自动产生Local Port
    Winsock1.Connect  "140.116.253.247" '设定改成您 Server 电脑的IP 号码
    End SubPrivate Sub Command2_Click()
    Winsock1.SendData  "Close"  '通知Server端Close
    DoEvents
    Winsock1.Close
    End SubPrivate Sub Command3_Click()
    Winsock1.SendData Text1.Text
    End SubPrivate Sub Form_Load()
    Winsock1.RemotePort = 3128  '设定与Server端做Listen的Port相同
    Command1.Caption = "Connect"
    Command2.Caption = "Close"
    Command3.Caption = "Send"
    List1.Clear
    End SubPrivate Sub Form_Unload(Cancel As Integer)
    If Winsock1.State <> sckClosed Then
       Winsock1.SendData  "Close"
       DoEvents
       Winsock1.Close
       Winsock1.LocalPort = 0
    End SubPrivate Sub Winsock1_Connect()
    If Winsock1.State = sckConnected Then
       List1.AddItem "Connected! LocalPort =" + Str(Winsock1.LocalPort) + " RemptePort = " + Str(Winsock1.RemotePort)
    End IfEnd SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim mydata As String
    Winsock1.GetData mydata, vbString
    List1.AddItem mydata
    End SubPrivate Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    List1.AddItem Description
    End Sub 
      

  2.   

    TO hsghxm(呵本) 感谢你的回复,但是我想知道的是如下问题:1、服务端程序采用 winsock 控件数组(使用TCP协议),多个用户(例如10个)同时发送请求给服务端程序,服务端程序是否可以同时响应10个用户的请求?
    2、winsock 控件是多线程吗?
    3、如果 winsock 控件数组是多线程,如何写程序才可以作到同时处理多用户的请求?
      

  3.   

    我有一个vc写的控件,支持千人同时收发,需要可与我联系
    qq.24508609
      

  4.   

    1、服务端程序采用 winsock 控件数组(使用TCP协议),多个用户(例如10个)同时发送请求给服务端程序,服务端程序是否可以同时响应10个用户的请求?不可以,winsock的最大并发量是五
    winsock一个sock就是一条独立的线程
      

  5.   

    WINSOCK不是单元线程吗?如果是,它是可以同时响应很多的,只要LOAD足够的WINSOCK控件!
      

  6.   

    TO VirtualDesktop(吴滂)既然winsock一个sock就是一条独立的线程,那么为什么不可以进行多用户同时响应?我使用的是winsock数组,一个winsock单独监听连接请求,使用load 进行winsock的创建,形成winsock数组,这样是否可以进行多用户同时响应?
      

  7.   

    我以前都是每个客户机用ADO直接连接SQL SERVER,现在正好在用这种Winsock方法做C/s程序,我发现当有一个客户机从服务器要量大的数据时,其他的客户就要等速度显得很慢,没有ADO直接连SQL那么快,为什么SQL就做得到那么快呢。只有一客户端用一条SQL语句提出1000条的记录花 3秒,但如果两客户机同时提起 就两个客户机都花6秒,这说明服务器不能同时处理。但多用户是同时响应了的。
      

  8.   

    winsock是异步处理。
    但并不是多线程。
      

  9.   

    线程和winsock没关系的,你的程序的问题,消息到来,你的程序会依次处理,但不能并行,除非你写成多线程,但vb6默认是单线程,要写多线程也可以,用一堆API ,难写还容易出错,vb默认的很多东西象str()函数等都不能用了,因为它们不支持多线程,只能在多线程里进行一些算术运算,我试过的
      

  10.   

    没有绝对
    的同步! Cpu在单一时刻只能做一件事 所以同步只能算的上是宏观意义上的同步!
      

  11.   

    创建WInsock数组.收发信息就是多线程的.但是是要排队滴...
    任何进程都要在CPU处排队.控件也要在内存中排队.发送也要排队.专业服务器也要排队滴...虽然他用了多颗CPU和大容量内存来做处理和缓冲..但是还是要排队滴....
    不过.CPU的处理不是根据进程来的,是根据管线来的.
      

  12.   

    写多线程不用API啊.数组即可.关键看技巧.
    数组+技巧.
    我的扫描器就是这样搞出来的.速度快.且简单.
    一次创建1000个控件扫描,扫出一个断开,卸载掉,超时一个断开,卸载掉,与此同时使用循环Load新的控件.利用循环的套嵌可以实现. 
    自己琢磨吧.很简单.
      

  13.   

    那总得说楼主的问题是否有个答案?1、服务端程序采用 winsock 控件数组(使用TCP协议),多个用户(例如10个)同时发送请求给服务端程序,服务端程序是否可以同时响应10个用户的请求?
      

  14.   

    winsock加载后会产生一个sock线程(独立于程序主线程外),但是他只是负责收发数据加入缓冲区,dataarrival,getdata等仍然是VB主线程执行的,所以无法同时相应10个用户
      

  15.   

    TO: billow_chentao(巨浪) 
    应该是你的程序写烂了..根本就不忧,我写的sock代替sql远程访问数据据还是比较快的..这个时候效率问题就要注重了..
      

  16.   

    windows本来就是单线程的,只不过是处理事情太快就感觉得像是多线程..一个消息队列的机制..我在sock内部请求发送都是一个消息队列的过程..一件件事情的做..
      

  17.   

    1、服务端程序采用 winsock 控件数组(使用TCP协议),多个用户(例如10个)同时发送请求给服务端程序,服务端程序是否可以同时响应10个用户的请求?
    这些你基本上不用担心2、winsock 控件是多线程吗?
    可以这么看.3、如果 winsock 控件数组是多线程,如何写程序才可以作到同时处理多用户的请求?
    这个是需要你去理解.