首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

一个WINSOCKET控件可同几个客户端进展连接

2013-06-25 
一个WINSOCKET控件可同几个客户端进行连接一个WINSOCKET控件可同几个客户端进行连接,连接到的客户端,如何

一个WINSOCKET控件可同几个客户端进行连接
一个WINSOCKET控件可同几个客户端进行连接,连接到的客户端,如何获得客户端的IP,HOSTNAME,端口等信息。谢谢大家。

还有能否提供一份多人聊天室的源码
[解决办法]
连接数的话看你怎么用法了,如果是udp做群发的话一个控制就可以群发群收了,不过只能在同一局域网里边
如果tcp下做的话,服务端用掉一个winsock做server 然后建个winsock数组处理客户端的连接,客户端程序只要一个控制就够了。winsock连接上之后,在remoteip里就可以读到IP了,不过主机名好象读不上来,要客户端程序自己来提交了
[解决办法]
可以很多。

服务端首先建立一个服务对象数组,用元素 0 来侦听。

接收到客户的连接请求时,就增加一个数组元素。请求会发送客户端的参数。

当一个客户端退出或检测到它断开时,就释放相应的数组元素。

到网上可以搜到很多例子,其中有微软官方的示例代码。
[解决办法]

引用:
Quote: 引用:

连接数的话看你怎么用法了,如果是udp做群发的话一个控制就可以群发群收了,不过只能在同一局域网里边
如果tcp下做的话,服务端用掉一个winsock做server 然后建个winsock数组处理客户端的连接,客户端程序只要一个控制就够了。winsock连接上之后,在remoteip里就可以读到IP了,不过主机名好象读不上来,要客户端程序自己来提交了


再请教一下,这个winsock数组 通常要建包含多少个WINSOCK的数组呢?

数组是做成动态的,需要的时候就load一个,做个连接计数,自己控制一下连接的数量,我做过的东西都比较小,连接数也都才十几个的,上限有多大我也不清楚。
[解决办法]
在窗体上拉个winsock控件上来,然后把控件Index属性填成 0
别的代码抄进去就可以了,服务器端:

Private Sub Form_Load()
    Winsock1(0).LocalPort = 2013 '指定服务器监听端口
    Winsock1(0).Listen '开始监听
End Sub

Private Sub Winsock1_Close(Index As Integer)
    Winsock1(Index).Close '对方断开
End Sub

Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    Dim I As Integer
    I = 1
    If Winsock1.UBound > 0 Then
        For I = 1 To Winsock1.UBound
            If Winsock1(I).State = 0 Then Exit For '查找空闲的winsock控件
        Next
    End If
    If I > Winsock1.UBound Then Load Winsock1(I) '没有空闲控件的话创建一个新控件
    Winsock1(I).Accept requestID '应答客户端的请求 连接建立时将触发connect事件,表示连接正式建立
End Sub

Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim Data() As Byte'如果只想试试效果的话你可以改成 Dim Data As String '不过用数组接收数据会比字符串好
    Winsock1(Index).GetData Data '接收数据
    '数据通信基本上就在这下边来写代码了
End Sub

Private Sub Winsock1_Error(Index As Integer, 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)
    Winsock1(Index).Close '网络错误


End Sub


[解决办法]
客户端的话下边这样写就可以了
 winsock1.connect "远程计算机名或者IP",服务端口 
发送数据用 winsock1.SendData Data
接收数据一样是在DataArrive事件里
同一控件要重复使用的话下一次connect之前要close掉
[解决办法]
客户端的localport可以不设,电脑会随机分配一个,等连接完成时你读一下localport就知道是多少了
[解决办法]
一个winsock同时只能和一个用户连接,因为其只有一个remote的ip和端口,但是,你可以创建winsock数组,每个单元连接一个用户
[解决办法]
引用:
Quote: 引用:

客户端的话下边这样写就可以了
 winsock1.connect "远程计算机名或者IP",服务端口 
发送数据用 winsock1.SendData Data
接收数据一样是在DataArrive事件里
同一控件要重复使用的话下一次connect之前要close掉


再请教一下,客户端的LOCALPORT是否可以随意设置的,有没有必要和服务器端一致,如果不设置的话,那在与服务器端建立连接后,这个LOCALPORT的值会是多少?


客户端的localport设置可以随意,但是不能是被其它程序占用的端口,以及一些协议使用端口,如80,8080 135等等

如果没有设置会默认为0,可能会冲突

热点排行