就用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台机器 可传到客户端的时候。接受到的数据就丢包很多。
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
试试tcpip协议吧
最好代码贴出来,说明写出来
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台机器
可传到客户端的时候。接受到的数据就丢包很多。
第二,协议选择:既然选择了UDP,就应该知道会丢包。要不就在用户控制下重新发送,要不然就建立回执结构,只有收到回执的才算发送成功(这样不免发送重复,另外也造成程序上的复杂化)
第三,选择一个现成的收发模块,具有发送校验功能的,仍然是UDP协议,但具有TCP的效果。
不是丢包了,我以前遇到过,你在每次发送信息前加一条doevents就可以了!
发送的时候数据不正常,我测的时候经常性的出现延时现象,就是因为这条语句造成的,而且不一定什么时候自己又发送回来了!
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
K2|123 K2|1 K2|23 K2|78 K2|45 K2|69 K2|41 K1|222 K4|364…………
-------------
最好后面来个vbcrlf表示结束调试一下接收到的数据看看代码错在哪,winsock不会替你丢包的