做一聊天程序,需要传送用户列表。但用户列表传送时丢失数据十分严重。如何解决?

解决方案 »

  1.   

    用tcpip还是用udp?
    试试tcpip协议吧
      

  2.   

    这个不要怪WINSOCK
    最好代码贴出来,说明写出来
      

  3.   

    就用TCP协议
    KEY格式:K2|123(K关键字没用,2是部门名称代码,|是分割符,123是winsock(index)对应的IP最后一段,即192.168.0.123)
    I_G函数取123这个值,IP4函数取(192.168.0.123)中的最后一段位即123这个值
    NUM为数组控件wskServer的当前最大值,即每登陆一个客户端,NUM就加1
    服务端:
        For i = 1 To Num
            If Me.wskServer(i).State = 9 Or Me.wskServer(i).State = 8 Or Me.wskServer(i).State = 0 Then
            Else
                For j = 14 To Me.TVList.Nodes.Count
                    'If I_G(Me.TVList.Nodes(j).Key, 1) = Ip4(Me.wskServer(i).RemoteHostIP) Then
                        UserList = UserList & " " & Me.TVList.Nodes(j).Key
                    'End If
                Next j
                Me.wskServer(i).SendData UserList
            End If
        Next i-------------------------------------------这样最后UserList字符串的形式如下:
     K2|123 K2|1 K2|23 K2|78 K2|45 K2|69 K2|41 K1|222 K4|364…………
    最多也就100台机器
    可传到客户端的时候。接受到的数据就丢包很多。
      

  4.   

    第一,程序问题:在发送时如果超过8K就分包发送,另外,发送完后不要立即发送下一包,最好是等待回执,回执到了再发送下一包。另外,在同一台机器上收发,丢包的可能性就大得多。
    第二,协议选择:既然选择了UDP,就应该知道会丢包。要不就在用户控制下重新发送,要不然就建立回执结构,只有收到回执的才算发送成功(这样不免发送重复,另外也造成程序上的复杂化)
    第三,选择一个现成的收发模块,具有发送校验功能的,仍然是UDP协议,但具有TCP的效果。
      

  5.   

    这个问题啊?
    不是丢包了,我以前遇到过,你在每次发送信息前加一条doevents就可以了!
    发送的时候数据不正常,我测的时候经常性的出现延时现象,就是因为这条语句造成的,而且不一定什么时候自己又发送回来了!
      

  6.   

    For i = 1 To Num
            If Me.wskServer(i).State = 9 Or Me.wskServer(i).State = 8 Or Me.wskServer(i).State = 0 Then
            Else
                For j = 14 To Me.TVList.Nodes.Count
                    'If I_G(Me.TVList.Nodes(j).Key, 1) = Ip4(Me.wskServer(i).RemoteHostIP) Then
                        UserList = UserList & " " & Me.TVList.Nodes(j).Key
                    'End If
                Next j
    '上面写的太乱了,这里直接加一句doevents就OK了,你试一下吧!
                Me.wskServer(i).SendData UserList
            End If
        Next i
      

  7.   

    这样最后UserList字符串的形式如下:
     K2|123 K2|1 K2|23 K2|78 K2|45 K2|69 K2|41 K1|222 K4|364…………
    -------------
    最好后面来个vbcrlf表示结束调试一下接收到的数据看看代码错在哪,winsock不会替你丢包的