发送端程序:
for i=0 to 10
  winsock1.senddata i & chr(0)
next接收端程序:
Private Sub WsMain_DataArrival(ByVal bytesTotal As Long)
  Dim Data As String
  winsock2.GetData Data
  list1.additem data
End Sub此时程序预想在接收端应该是在List1中顺序添加0-10的数字,而实际是在list1中添加了012345678910这一个ITEM项,为什么?

解决方案 »

  1.   

    测试了一下你的代码  发现  FOR循环是一起发过去的
    所以接受没有分条  你可以单步调试看下Private Sub Timer1_Timer()
      Winsock1.SendData i & chr(i)
    i = i + 1
    If i = 10 Then Timer1.Enabled = False
    end sub这样就可以的..............
      

  2.   

    我这只是个例子,其实我真实的目的是服务端访问数据库,一条条从数据库中读出数据,然后再一条条发给客户端,客户端接收后再一条条显示,所以,二楼的办法并不是真正解决问题的关键,为什么winsock发送时,不到end sub或end function,客户端就不接收呢???谢谢!!!
      

  3.   

    for i=0 to 10
      winsock1.senddata i & chr(0)
    next
     
     发送的时候特别有循环的时候希望你以后加上这条语句
      for i=0 to 10
      winsock1.senddata i & chr(0)
      Doevents
    next
    这样就能确保对方一条一条的接收,像上面那样,对方就可以触发接收事件11 次
      

  4.   

    还是不行,服务端Msgbox时,有时是"0" ,有时是"123",有时是"45",有时是"6",还是不行。我以前曾经使用过Doevents语句,不能达到目的。
      

  5.   

    比如我以下的程序,服务端:
    Private Sub Form_Load()
      WsListen.LocalPort = 7000
      WsListen.Listen
    End SubPrivate Sub WsListen_ConnectionRequest(ByVal requestID As Long)
      WsServer.Accept requestID
    End SubPrivate Sub WsServer_DataArrival(ByVal bytesTotal As Long)
      Dim Data As String
      WsServer.GetData Data
      MsgBox Data
    End Sub客户端:
    Private Sub Form_Load()
      WsClient.RemotePort = 7000
      WsClient.RemoteHost = "192.168.10.3"
      LoadTime = Now()
      If WsClient.State = 0 Then
          WsClient.Connect
          Do Until WsClient.State = 7
            If DateDiff("s", LoadTime, Now) >= 5 Then
              MsgBox "·þÎñÆ÷Á¬½Óʧ°Ü£¡³ÌÐòÎÞ·¨ÔËÐУ¡", 16, "Á¬½Óʧ°Ü"
              End
              Exit Do
            End If
            DoEvents
          Loop
        End If
        
        If WsClient.State = 7 Then
          For i = 0 To List1.ListCount - 1
            WsClient.SendData List1.List(i)
            DoEvents
          Next
        End If
    End Sub
    其中客户端有一个List1,共有五项,分别是赵、钱、孙、李、周等五个姓氏,使用了Doevents后,服务端Msgbox分了两次,一次显示“赵钱”,一次显示“孙李周”,而不是我所期望的分五次显示这五个姓氏。谢谢大家再帮我分析一下。
      

  6.   

    MsgBox Data 
      换用debug.print  Data  看看
     
      

  7.   

    你把这几个list一下子发过去,用","分开,然后在服务端再分解啊.
      

  8.   

    每次发时加" " & 编号
    然后接收端分解
      

  9.   

    晕呀,你搞个list1.additem data
    当然成添加节点了呀
      

  10.   

    比如我以下的程序,服务端:
    Private Sub Form_Load()
      WsListen.LocalPort = 7000
      WsListen.Listen
    End SubPrivate Sub WsListen_ConnectionRequest(ByVal requestID As Long)
      WsServer.Accept requestID
    End SubPrivate Sub WsServer_DataArrival(ByVal bytesTotal As Long)
      Dim Data As String
      WsServer.GetData Data
      MsgBox Data
    End Sub客户端:
    Private Sub Form_Load()
      WsClient.RemotePort = 7000
      WsClient.RemoteHost = "192.168.10.3"
      LoadTime = Now()
      If WsClient.State = 0 Then
          WsClient.Connect
          Do Until WsClient.State = 7
            If DateDiff("s", LoadTime, Now) >= 5 Then
              MsgBox "·þÎñÆ÷Á¬½Óʧ°Ü£¡³ÌÐòÎÞ·¨ÔËÐУ¡", 16, "Á¬½Óʧ°Ü"
              End
              Exit Do
            End If
            DoEvents
          Loop
        End If    Dim t1 As Date    If WsClient.State = 7 Then
          For i = 0 To List1.ListCount - 1
            WsClient.SendData List1.List(i)
         '*******************发完一次数据停顿2秒再发下一次数据
             t1 = Time
             Do While 1
                DoEvents
                If DateDiff("s", t1, Time) >= 2 Then Exit Do
            Loop
          Next
        End If
    End Sub
    其中客户端有一个List1,共有五项,分别是赵、钱、孙、李、周等五个姓氏,使用了Doevents后,服务端Msgbox分了两次,一次显示“赵钱”,一次显示“孙李周”,而不是我所期望的分五次显示这五个姓氏。谢谢大家再帮我分析一下。
      

  11.   

    Winsock及更底层核心的会把你应用层的数据包(应用层数据包)重新打包(我们假设称之为底层数据包)后再发送的。接收端接收到的是底层数据包,而不是应用层数据包。所以,当应用层每次发送的数据包中数据量比较小时,会出现接收端是一次接收到了多个应用层数据包,原因是发送端底层将多个应用层数据包打成一个底层数据包一起发送了。反之,当应用层每次发送的数据包的数据量比较大时,会出现接收端是一次接收不到一个完整的应用层数据包,原因是发送端将一个应用层数据包分成多个底层数据包进行发送了。这些情况在通讯中是非常的。用延时、DoEvents是不能很好地解决这类问题的。解决的办法是定义数据的格式,例如楼主的代码中,在每个数据包(应用层数据包)最后加上了Chr(0)作为结束符。在接收端,需要把在结束符出现之前接收到的数据包(底层数据包)全部要缓存起来,直到接收到结束符为止,然后处理结束符之前的数据(即一个完整的应用层数据包)。