在发送的语句后面加一条Doevents

解决方案 »

  1.   

    这是因为发送方快速发送,接受方还来不及处理或由于网络原因传送的数据还没有到达接收方。而且winsock中有个缓冲池的,只要你发送的数据不超过他的最大值,他能暂时保存发送过来的没处理的数据,直到处理完毕。
    由于在for循环中senddata,发送的太快了,所以接受方全部一次接受,这还有可能造成数据丢失。
      

  2.   

    For i = 1 To 16
    strdata = CStr(yourcard(i))
    wsk(0).SendData strdata
    Next i
    这不是一个个发送,这个就是将数组中的内容一次全部发送出去!
      

  3.   

    楼上兄弟你看看这几条语句下来,执行了几次senddata了?//////
      

  4.   

    我又改了一下代码。这次怎么会出现这样的结果。
    '发送
    Dim sdata(16) As Integer
    For i = 1 To 16
        sdata(i) = i
        Winsock1.SendData sdata(i)
    Next i
    '接收.
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim vta As Integer
    Winsock1.GetData vta, vbInteger
    Text1.Text = Text1.Text & vta
    End Sub
    结果按第一次发送,text1.text显示1
    第二次.text1.text变为12
    第三次.text1.text变为123
    第四次.text1.text变为1234
    第五次.text1.text变为12345........
    ..........
    第16次.text1.text变为12345678910111213141516
    第17次.text1.text变为123456789101112131415161怎么每次只收到一个数字.每次递增.
    靠,真烦.
      

  5.   

    其实是你搞错了,不要用Text1.Text = Text1.Text & vta
    改成Text1.Text=vta
    不就ok了?Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim vta As Integer
    Winsock1.GetData vta, vbInteger
    Text1.Text = Text1.Text & vta
    End Sub
      

  6.   

    '发送数据。
    添加Timer1,Interval=125SUB Timer1_Timer()
    i=i+1
    if i>16 then Timer1.Enable=False
    strdata = CStr(yourcard(i))
    wsk(0).SendData strdata
    doevents
    END SUB'接收的不变
      

  7.   

    这个问题这样解决不就行了(反正我的软件是这样的)在发送的每一条消息后加一个分隔符(如*@!&~!)然后在服务器端按分隔符来取出信息。再来分析数据。
      

  8.   

    '发送
    Dim szSend as string
    For i = 1 To 16
        szSend=szSend & i & ","
    Next i
    szSend=left(szSend,len(szSend)-1)
    Winsock1.SendData szSend
    '接收
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
       Dim vta As Integer,szRecv as varaint
       Dim i&
       Winsock1.GetData vta, vbInteger
       szRecv=split(vta,",")
       for i=0 to ubound(szRecv)
           Text1.Text = Text1.Text & szRecv(i) & vbTab
       next i
    End Sub
      

  9.   

    反正这样发收的时候肯定是一起到的.因为发的数据先要进缓存,然后再慢慢发,因此用延时也是不精确的,有可能会错.
    楼上的方法是可取的,不过有可能定位不精确,即不知道这是第几个发的数据.
    我用过一个方法,你可以考虑考虑
    发的时候发一个数据,然后接收端收到后返回,
    发送端接收返回的数据后,判断是否为原来发送的,如果是就再发下一个,实际用下来基本没什么大的延时,当然是在MODEM连接下,发送的数据量也不大.
      

  10.   

    问题不需要那么复杂!!你们搞什么飞机??用Split函数,我一直用它!很好,从没出错!~看你们这些人的文章真累!!!
      

  11.   

    For i = 1 To 16
    strdata = CStr(yourcard(i))
    wsk(0).SendData strdata & chr(10)
    Next i
    每发送一条数据在后面加个回车符或换行符。
      

  12.   

    我编客户机/服务器模式的程序时也遇到同样的问题,后来是发送端每发送一条数据库记录,接收端收到后就返回一个“OK”之类的信息给服务器端,服务器端收到“OK”信息就接着发送下一个数据库记录。
    我想你如果试试这个方法一定可行的。实际上也引起不了多少延时,只是要处理好数组(我用的动态数组)的下标越界情况,以免出现下标越界情况。在实际运行中如果服务器端不是很老的机的话根本没多少影响的。
      

  13.   

    相反如果发送数据量大时,用分解字符串的方法倒会出错,因为winsock在缓冲区满后才会读一次数据,我曾在大数据量情况下试过,根本可以说不是很可行,因为很可能出现字符串包含乱码的情况(在我的机子上是在第三次填满缓冲区时读数据会出现乱码)。因为我所要编的程序要求对字符串准确性比较高,所以只好用客户端接收到后应答的方法解决了。