VB6 通过winsock控件数组实现客户端和服务器多对一通信
2014-10-14 09:40
537 查看
在VB6中使用winsock控件需要引用Microsoft Winsock Control 6.0部件
使用winsock控件可以实现客户端和服务器间C/S结构的通信,如果把客户端和服务器放置于同一台电脑中,并且将客户端winsock的RemoteHost设置为本机IP,则可以实现客户端程序和服务端程序间的自由通信。在应用程序之间采用winsock通信比内存共享等方法更简单快捷,同时也更安全。
在客户端中添加一个窗体,拖拽一个winsock控件到该窗体上。
[vb] view
plaincopy
Private Sub Form_Load()
Me.Winsock1.RemoteHost = "192.168.1.5"
Me.Winsock1.RemotePort = 10002
Me.Winsock1.Connect
End Sub
RemoteHost代表需要连接的远程服务器IP地址,局域网中的通信可以使用路由器分配的IP地址。
RemotePort代表端口号,服务器和客户端通过该端口进行连接。
[vb] view
plaincopy
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim strGet As String
'接收字符串并写入Text1控件中
Winsock1.GetData strGet
Text1.Text = strGet
End Sub
当客户端的winsock接收到服务器发送来的数据后会触发Winsock1_DataArrival事件,利用GetData方法可以将数据读取出来,一般来说将数据读取到byte()数组中是最好的,因为利用字节数组可以收发图片、音频等文件,本例中为了演示所以直接用一个字符串变量来读取数据了。
[vb] view
plaincopy
Dim strSet As String
Winsock1.SendData strSet
客户端向服务器发送数据可以用SendData方法,该方法同样可以发送字节数组,这里为了演示所以发送了个字符串。
服务器端为了能同时和很多个不同的客户端进行通信,所以需要采用winsock控件数组,在服务器窗体中拖拽一个winsock控件,将其名称更改为Listener,该控件用于接收客户端的连接请求。再拖拽一个winsock控件到窗体中,然后将其Index属性更改为0,0即代表该控件是一个控件数组,为了使用方便所以把控件名称更改为Sock,该控件数组用于动态的和不同的客户端通信。
在服务器端的窗口中写入如下代码:
[vb] view
plaincopy
Private Sub Form_Load()
Load Sock(0)
Listener.LocalPort = 10002 '端口号
Listener.Listen '开始侦听
End Sub
利用Listener来侦听,代码如下:
[c-sharp] view
plaincopy
Private Sub Listener_ConnectionRequest(ByVal requestID As Long)
Dim SockIndex As Integer: SockIndex = 8888
Dim i As Integer
'遍历控件
For i = 0 To Sock.UBound
If Sock(i).State = 0 Then SockIndex = i
Next
If SockIndex = 8888 Then
Load Sock(Sock.UBound + 1)
SockIndex = Sock.UBound
End If
'接受请求
Sock(SockIndex).Accept (requestID)
End Sub
当有客户端需要连接服务器时会触发Listener_ConnectionRequest事件,此时会遍历Sock控件数组,如果里面有空闲的Sock则用这个空闲的Sock和客户端进行连接,如果没有空闲的则重新Load一个进来。这里俺将SockIndex赋了个8888的值,这是因为用于和客户端连接的Sock控件数组的下标为0,为了省事所以赋了个8888,这个方法不太安全的,所以大家别学我,呵呵
当客户端和服务器端成功连接后就可以利用Sock控件数组来和客户端相互传递数据了,当客户端将数据发送给服务器端时会触发Sock_DataArrival事件,代码如下:
[vb] view
plaincopy
Private Sub Sock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strGet As String
'接收字符串并写入text中
Sock(Index).GetData strGet
Text2.Text = strGet
End Sub
Index参数代表正在和客户端保持连接的Sock控件数组的序号,而bytesTotal代表数据的长度(汗,这样解释貌似不怎么对)
,利用GetData方法即可以将数据读取出来。
如果服务器想给客户端发送数据,则直接用SendData方法即可,如下所示:
[vb] view
plaincopy
Dim strSend as String
Sock(Index).SendData strSend
Index代表的是Sock数组的序号,如果想给所有保持连接的客户端都发送相同的内容,则可以遍历一下Sock数组,然后挨个发送就是了,如下所示:
[vb] view
plaincopy
For i = 0 To Sock.UBound
If Sock(i).State = 7 Then
Sock(i).SendData "范例"
End If
Next i
如果服务器端想关闭某个连接,则需要关闭对应的Sock(),如下所示:
[vb] view
plaincopy
Sock(Index).Close
上面的这些代码演示了如何实现一个简单的C/S结构服务器和客户端连接。 经验证是正确的
1 通信程序通常都是采用Client/Server形式。这就要求作为服务器的主机可以同时处理多个客户的请求。因此在编写服务器程序时要添加多个Winsock控件。在开始我们先加入两个Winsock控件。其中一个用来侦听网上请求信号,取名为Listener;另外一个为初始的连接口,取名叫Sock(0)。注意,后一个控件要设为动态数组的形式,以后当客户增多时,可在这个控件基础上动态增加。由于受资源限制,我们在本例中设定最多可以同时接纳15个客户。客户机一般只与一个主机相连,因此程序只须一个Winsock进行连接就足够了。这个程序要用到的控件较少,除了Winsock和Form控件外,只须再添加Commmand控件即可。下面是具体程序和详细注释。
2 ******************************
3 '服务器程序
4 ******************************
5 Option Explicit
6 定义常量
7 Const BUSY As Boolean = False
8 Const FREE As Boolean = True
9 定义连接状态
10 Dim ConnectState() As Boolean
11 Private Sub Form_Load()
12 ReDim Preserve ConnectState(0 To 1)
13 On Error Resume Next
14 ConnectState(0) = FREE
15 ConnectState(1) = FREE
16 '指定网络端口号
17 Listener.LocalPort = 1011
18 '开始侦听
19 Listener.Listen
20 End Sub
21 Private Sub Listener_ConnectionRequest(ByVal requestID As Long)
22 Dim SockIndex As Integer
23 Dim SockNum As Integer
24 On Error Resume Next
25 Form1.Print requestID & "连接请求"
26 '查找连接的用户数
27 SockNum = UBound(ConnectState)
28 If SockNum > 14 Then
29 Form1.Print SockIndex & ""
30 Exit Sub
31 End If
32 '查找空闲的sock
33 SockIndex = FindFreeSocket()
34 '如果已有的sock都忙,而且sock数不超过15个,动态添加sock
35 If SockIndex > SockNum Then
36 Load Sock(SockIndex)
37 End If
38 ConnectState(SockIndex) = BUSY
39 Sock(SockIndex).Tag = SockIndex
40 '接受请求
41 Sock(SockIndex).Accept (requestID)
42 Form1.Print SockIndex & "接受请求"
43 End Sub
44
45 '客户断开,关闭相应的sock
46 Private Sub Sock_Close(Index As Integer)
47 If Sock(Index).State <> sckClosed Then
48 Sock(Index).Close
49 End If
50 ConnectState(Index) = FREE
51 Form1.Print Index & "close"
52 End Sub
53
54 '接收数据
55 Private Sub Sock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
56 Dim dx As Double
57 Form1.Print "数据来自" & Index
58 Sock(Index).GetData dx, vbDouble
59 Form1.Print "dx=" & dx
60 End Sub
61
62 '寻找空闲的sock
63 Public Function FindFreeSocket()
64 Dim SockCount, i As Integer
65 SockCount = UBound(ConnectState)
66 For i = 0 To SockCount
67 If ConnectState(i) = FREE Then
68 FindFreeSocket = i
69 Exit Function
70 End Ifs
71 Next i
72 ReDim Preserve ConnectState(0 To SockCount + 1)
73 FindFreeSocket = UBound(ConnectState)
74 End Function
75
76 ***************************
77 '客户程序
78 ’***************************
79 Option Explicit
80 '发送数据
81 Private Sub command1_Click()
82 Dim dx As Double
83 dx = 23.9
84 sock.SendData dx
85 MsgBox ("data sended")
86 End Sub
87
88 Private Sub Form_Load()
89 '远程主机名
90 sock.RemoteHost = "media2"
91 '网络端口
92 sock.RemotePort = 1011
93 '发出连接命令
94 sock.Connect
95 Command1.Enabled = False
96 End Sub
97
98 '服务器关闭
99 Private Sub sock_Close()
100 MsgBox ("socket closed")
101 End Sub
102
103 '连接成功
104 Private Sub sock_Connect()
105 MsgBox ("socket connected")
106 Command1.Enabled = True
107 End Sub
使用winsock控件可以实现客户端和服务器间C/S结构的通信,如果把客户端和服务器放置于同一台电脑中,并且将客户端winsock的RemoteHost设置为本机IP,则可以实现客户端程序和服务端程序间的自由通信。在应用程序之间采用winsock通信比内存共享等方法更简单快捷,同时也更安全。
在客户端中添加一个窗体,拖拽一个winsock控件到该窗体上。
[vb] view
plaincopy
Private Sub Form_Load()
Me.Winsock1.RemoteHost = "192.168.1.5"
Me.Winsock1.RemotePort = 10002
Me.Winsock1.Connect
End Sub
RemoteHost代表需要连接的远程服务器IP地址,局域网中的通信可以使用路由器分配的IP地址。
RemotePort代表端口号,服务器和客户端通过该端口进行连接。
[vb] view
plaincopy
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim strGet As String
'接收字符串并写入Text1控件中
Winsock1.GetData strGet
Text1.Text = strGet
End Sub
当客户端的winsock接收到服务器发送来的数据后会触发Winsock1_DataArrival事件,利用GetData方法可以将数据读取出来,一般来说将数据读取到byte()数组中是最好的,因为利用字节数组可以收发图片、音频等文件,本例中为了演示所以直接用一个字符串变量来读取数据了。
[vb] view
plaincopy
Dim strSet As String
Winsock1.SendData strSet
客户端向服务器发送数据可以用SendData方法,该方法同样可以发送字节数组,这里为了演示所以发送了个字符串。
服务器端为了能同时和很多个不同的客户端进行通信,所以需要采用winsock控件数组,在服务器窗体中拖拽一个winsock控件,将其名称更改为Listener,该控件用于接收客户端的连接请求。再拖拽一个winsock控件到窗体中,然后将其Index属性更改为0,0即代表该控件是一个控件数组,为了使用方便所以把控件名称更改为Sock,该控件数组用于动态的和不同的客户端通信。
在服务器端的窗口中写入如下代码:
[vb] view
plaincopy
Private Sub Form_Load()
Load Sock(0)
Listener.LocalPort = 10002 '端口号
Listener.Listen '开始侦听
End Sub
利用Listener来侦听,代码如下:
[c-sharp] view
plaincopy
Private Sub Listener_ConnectionRequest(ByVal requestID As Long)
Dim SockIndex As Integer: SockIndex = 8888
Dim i As Integer
'遍历控件
For i = 0 To Sock.UBound
If Sock(i).State = 0 Then SockIndex = i
Next
If SockIndex = 8888 Then
Load Sock(Sock.UBound + 1)
SockIndex = Sock.UBound
End If
'接受请求
Sock(SockIndex).Accept (requestID)
End Sub
当有客户端需要连接服务器时会触发Listener_ConnectionRequest事件,此时会遍历Sock控件数组,如果里面有空闲的Sock则用这个空闲的Sock和客户端进行连接,如果没有空闲的则重新Load一个进来。这里俺将SockIndex赋了个8888的值,这是因为用于和客户端连接的Sock控件数组的下标为0,为了省事所以赋了个8888,这个方法不太安全的,所以大家别学我,呵呵
当客户端和服务器端成功连接后就可以利用Sock控件数组来和客户端相互传递数据了,当客户端将数据发送给服务器端时会触发Sock_DataArrival事件,代码如下:
[vb] view
plaincopy
Private Sub Sock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strGet As String
'接收字符串并写入text中
Sock(Index).GetData strGet
Text2.Text = strGet
End Sub
Index参数代表正在和客户端保持连接的Sock控件数组的序号,而bytesTotal代表数据的长度(汗,这样解释貌似不怎么对)
,利用GetData方法即可以将数据读取出来。
如果服务器想给客户端发送数据,则直接用SendData方法即可,如下所示:
[vb] view
plaincopy
Dim strSend as String
Sock(Index).SendData strSend
Index代表的是Sock数组的序号,如果想给所有保持连接的客户端都发送相同的内容,则可以遍历一下Sock数组,然后挨个发送就是了,如下所示:
[vb] view
plaincopy
For i = 0 To Sock.UBound
If Sock(i).State = 7 Then
Sock(i).SendData "范例"
End If
Next i
如果服务器端想关闭某个连接,则需要关闭对应的Sock(),如下所示:
[vb] view
plaincopy
Sock(Index).Close
上面的这些代码演示了如何实现一个简单的C/S结构服务器和客户端连接。 经验证是正确的
1 通信程序通常都是采用Client/Server形式。这就要求作为服务器的主机可以同时处理多个客户的请求。因此在编写服务器程序时要添加多个Winsock控件。在开始我们先加入两个Winsock控件。其中一个用来侦听网上请求信号,取名为Listener;另外一个为初始的连接口,取名叫Sock(0)。注意,后一个控件要设为动态数组的形式,以后当客户增多时,可在这个控件基础上动态增加。由于受资源限制,我们在本例中设定最多可以同时接纳15个客户。客户机一般只与一个主机相连,因此程序只须一个Winsock进行连接就足够了。这个程序要用到的控件较少,除了Winsock和Form控件外,只须再添加Commmand控件即可。下面是具体程序和详细注释。
2 ******************************
3 '服务器程序
4 ******************************
5 Option Explicit
6 定义常量
7 Const BUSY As Boolean = False
8 Const FREE As Boolean = True
9 定义连接状态
10 Dim ConnectState() As Boolean
11 Private Sub Form_Load()
12 ReDim Preserve ConnectState(0 To 1)
13 On Error Resume Next
14 ConnectState(0) = FREE
15 ConnectState(1) = FREE
16 '指定网络端口号
17 Listener.LocalPort = 1011
18 '开始侦听
19 Listener.Listen
20 End Sub
21 Private Sub Listener_ConnectionRequest(ByVal requestID As Long)
22 Dim SockIndex As Integer
23 Dim SockNum As Integer
24 On Error Resume Next
25 Form1.Print requestID & "连接请求"
26 '查找连接的用户数
27 SockNum = UBound(ConnectState)
28 If SockNum > 14 Then
29 Form1.Print SockIndex & ""
30 Exit Sub
31 End If
32 '查找空闲的sock
33 SockIndex = FindFreeSocket()
34 '如果已有的sock都忙,而且sock数不超过15个,动态添加sock
35 If SockIndex > SockNum Then
36 Load Sock(SockIndex)
37 End If
38 ConnectState(SockIndex) = BUSY
39 Sock(SockIndex).Tag = SockIndex
40 '接受请求
41 Sock(SockIndex).Accept (requestID)
42 Form1.Print SockIndex & "接受请求"
43 End Sub
44
45 '客户断开,关闭相应的sock
46 Private Sub Sock_Close(Index As Integer)
47 If Sock(Index).State <> sckClosed Then
48 Sock(Index).Close
49 End If
50 ConnectState(Index) = FREE
51 Form1.Print Index & "close"
52 End Sub
53
54 '接收数据
55 Private Sub Sock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
56 Dim dx As Double
57 Form1.Print "数据来自" & Index
58 Sock(Index).GetData dx, vbDouble
59 Form1.Print "dx=" & dx
60 End Sub
61
62 '寻找空闲的sock
63 Public Function FindFreeSocket()
64 Dim SockCount, i As Integer
65 SockCount = UBound(ConnectState)
66 For i = 0 To SockCount
67 If ConnectState(i) = FREE Then
68 FindFreeSocket = i
69 Exit Function
70 End Ifs
71 Next i
72 ReDim Preserve ConnectState(0 To SockCount + 1)
73 FindFreeSocket = UBound(ConnectState)
74 End Function
75
76 ***************************
77 '客户程序
78 ’***************************
79 Option Explicit
80 '发送数据
81 Private Sub command1_Click()
82 Dim dx As Double
83 dx = 23.9
84 sock.SendData dx
85 MsgBox ("data sended")
86 End Sub
87
88 Private Sub Form_Load()
89 '远程主机名
90 sock.RemoteHost = "media2"
91 '网络端口
92 sock.RemotePort = 1011
93 '发出连接命令
94 sock.Connect
95 Command1.Enabled = False
96 End Sub
97
98 '服务器关闭
99 Private Sub sock_Close()
100 MsgBox ("socket closed")
101 End Sub
102
103 '连接成功
104 Private Sub sock_Connect()
105 MsgBox ("socket connected")
106 Command1.Enabled = True
107 End Sub
相关文章推荐
- VB6 通过winsock控件数组实现客户端和服务器多对一通信
- VB6 通过winsock控件数组实现客户端和服务器多对一通信
- VB6 通过winsock控件数组实现客户端和服务器多对一通信
- VB6 通过winsock控件数组实现客户端和服务器多对一通信
- Linux下通过socket通信实现客户端向服务器发送文件
- java 通过 socket 实现 服务器和客户端的通信 TCP
- java 通过 socket 实现 服务器和客户端的通信 TCP
- LDAP 客户端通过 SSL 与 LDAP 服务器进行通信
- 搭建minisipserver服务器实现局域网内IOS客户端idoubs的通信(可打电话 发短信)
- Android客户端与PC服务器实现Socket通信(wifi)
- Android客户端通过socket与服务器通信
- 某实例+修改 Winsock实现基于TCP的客户端/服务器通信
- Android手机客户端通过JSP实现与Tomcat服务器端通信(Msql数据库,Json作为载体)--服务端代码
- Android客户端与PC服务器实现Socket通信(wifi)
- Android客户端与PC服务器实现Socket通信(wifi)
- Java 利用套接字Socket实现简单的服务器与客户端通信
- Android客户端与PC服务器实现Socket通信(wifi)
- android客户端通过Get方式提交参数给服务器,使用URL和HttpURLConnection实现,以及乱码问题解决
- winsock实现客户端 服务器通信
- 基于客户端轮询服务器思想实现的网页即时通信Demo