1.引言
目前已经有多种主流的网络通信软件,也有很多种制作网络聊天室的方法。
而使用VB制作是最为简单易行的。使用VB实现网络通信方法大同小异,本次制
作参考的文献资料基本方法基本都是使用Winsock控件编写服务器端、客户端通
信程序,实现了对基于TCP /IP协议的、面向连接的流方式套接字网络通信程序
设计。
本次设计同样使用了 VB 中的 Winsock 控件完成了本次网络通信软件的设
计制作,实现了两台计算机之间的通信初步实现服务器和客户端的通信和实现客
户端之间的通信。
2.Winsock 控件介绍
Winsock 控件对用户来说是不可见的,它提供了访问 TCP 和 UDP 网络服
务的方便途径。为编写客户或服务器应用程序,不必了解 TCP 的细节或调用低
级的 Winsock APIs。通过设置控件的属性并调用其方法就可轻易连接到一台远
程机器上去,并且还可双向交换数据。
打开 Visual Basic6.0,点击“工程”→“部件”,弹出对话框,选择 Microsoft
Winsock Control 6.0 。这时在工具箱中会多一个控件,这就是 Winsock 控件,现
在就可以开始使用它进行设计编程。
Winsock控件的常用属性:BytesReceived属性(接受数据的字节数),
LocalHostName属性(本地主机名称),LocalIP属性(本地主机IP),LocalPort属
性(本地主机端口),RemoteHost属性(远程主机名称),State属性(Winsock控
件)(网络状态【连接、未连接】),Protocol属性(值为0-sckTCPProtocol 时使用
TCP/ IP 协议,为1-sckUDPProtocol 时使用UDP 协议),Name属性(控件的名称),
RemotePort属性(ActiveX控件)(远程主机端口),Object属性。
Winsock 控件的常用方法:Accept 方法(接受 TCP 连接请求),Bind 方法,
Close 方法(关闭 TCP 连接),Listen 方法(监听 TCP 数据),PeerData 方法(获
得数据),SendData 方法(传输数据),GetData 方法(获得数据)
Winsock 控件的常用事件:Close 事件(关闭连接),ConnectionRequest 事件
(连接请求),DataArrival 事件(数据到达),SendComplete 事件(数据传输完
毕),SendProgress 事件(数据传输中),Error 事件(发生错误),Connect 事件
(建立连接)。
3.网络通信的实现
本次设计使用 TCP(数据传输协议)基础数据传输协议允许创建和维护与远
程计算机的连接。连接两台计算机就可彼此进行数据传输。
如 果 创 建 客 户 应 用 程 序 , 就 必 须 知 道 服 务 器 计 算 机 名 或 者 IP 地 址
(RemoteHost 属性),还要知道进行“侦听”的端口(RemotePort 属性),然后调
用 Connect 方法。
如果创建服务器应用程序,就应设置一个收听端口(LocalPort 属性)并调
用 Listen 方法。当客户计算机需要连接时就会发生 ConnectionRequest 事件。
为了完成连接,可调用 ConnectionRequest 事件内的 Accept 方法。
建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用
SendData 方法。当接收数据时会发生 DataArrival 事件。调用 DataArrival 事件
内的 GetData 方法就可获取数据。
3.1 实现两台电脑之间的通信
新建工程将其缺省窗体命名为“frmA”;将窗体的标题改为“点对点通信
(一)”。在窗体中添加一个 WinSock 控件。在窗体中添加 3 个 TextBox 控件。
默认其命名为 Text1、TxtOutput、TxtSend,并将其内容清空;将 TxtOutput 和
TxtSend 的 MultiLine 属性设置为 True,ScrollBars 属性设置为 2-Vertical。在窗体
中添加 2 个 CommandButton 控件,并将它们的 Caption 属性分别修改为“设置”、
“发送”。在窗体上放四个 Label 控件,其命名默认为 Label1、Label2、Label3,
并将它们的 Caption 属性修改为“计算机名称(IP 地址)”、“接收信息”、“发送
信息”。如图:
在代码窗口添加代码:
Private Sub Command1_Click()
With WB
.RemoteHost = Text1.Text
.RemotePort = 1002
.Bind 1001
End With
txtSend.Enabled = True
Command1.Enabled = False
End Sub
Private Sub Command2_Click()
WB.SendData txtSend.Text
End Sub
Private Sub WB_DataArrival(ByVal bytesTotal As Long)
Dim strdata As String
WB.GetData strdata
txtOutput.Text = strdata
End Sub
同样,新建工程,添加窗体点对点通信(二):
代码相同。
运行后输入对方计算机 IP 地址,点击设置;然后就可以发送信息了。
3.2 初步实现服务器和客户端的通信
服务器端:
创建新工程将其缺省窗体命名为“服务器”;将窗体的标题改为“服务器”。
在窗体中添加一个 WinSock 控件,默认其命名为 scksever。在窗体中添加 5 个
TextBox 控件。默认其命名为 Txt_Sever、Text1、Text2、Text3、Text4,并将其
内容清空;将 Txt_Sever 的 MultiLine 属性设置为 True,ScrollBars 属性设置为
2-Vertical。在窗体中添加 2 个 CommandButton 控件。其命名默认为 Command1、
cmd_fs,并将它们的 Caption 属性分别修改为“设置为服务器”、“发送信息”。在
窗体上放四个 Label 控件,其命名默认为 Label1、Label2、Label3、Label4,并
将它们的 Caption 属性修改为“本机 IP”、“客户端 IP”、“本机端口”、“客户端端
口”。如图:
scksever.LocalPort = Text3.Text
scksever.RemotePort = Text4.Text
scksever.Listen
MsgBox "设本机为服务器成功!", vbInformation, "提示"
Command1.Enabled = False
End If
End Sub
Private Sub scksever_connectionrequest(ByVal RequestID As Long)
If scksever.State <> sckClosed Then scksever.Close
scksever.Accept RequestID
End Sub
Private Sub cmd_fs_click()
If scksever.State = 7 Then
If Txt_Sever.Text = "" Then
MsgBox "不能发送空信息"
Else
scksever.SendData "SENDINF" & Txt_Sever.Text
End If
在代码窗口输入如下代码:
Private Sub Command1_Click()
Text1.Text = scksever.LocalIP
If Text2.Text = "" Or Text3.Text = "" Then
MsgBox "输入的内容不完全", , "提示信息"
Else
Else
MsgBox "没有连接,请查证后再试", vbInformation, "错误"
End If
End Sub
Private Sub scksever_dataarrival(ByVal bytestotal As Long)
Dim strdata As String
scksever.GetData strdata
Txt_Sever.Text = strdata
End Sub
客户端:
同样,新建工程,如图新建客户端窗体。
在代码窗口输入如下代码:
Private Sub Command1_Click()
If txtip.Text = "" Then
MsgBox "请输入服务器的 IP 地址,后连接", vbInformation, "提示"
txtip.SetFocus
Exit Sub
ElseIf Text3.Text = "" Then
MsgBox "请输入本机的端口号,后连接", vbInformation, "提示"
Text3.SetFocus
Exit Sub
ElseIf Text4.Text = "" Then
MsgBox "请输入服务器的端口号", vbInformation, "提示"
Text4.SetFocus
Exit Sub
Else
Command1.Enabled = False
sckclient.RemoteHost = txtip.Text
sckclient.LocalPort = Text3.Text
sckclient.RemotePort = Text4.Text
sckclient.Connect
End If
End Sub
Private Sub Command2_Click()
If sckclient.State = 7 Then
If Text1.Text = "" Then
MsgBox "不能发送空信息"
Else
sckclient.SendData Text1.Text
End If
Else
MsgBox "没有连接,请查证后再试", vbInformation, "错误"
End If
End Sub
Private Sub sckclient_dataarrival(ByVal bytestotal As Long)
Dim strdata As String
sckclient.GetData strdata
Text1.Text = strdata
End Sub
Private Sub Command3_Click()
txtip.Text = ""
Text3.Text = ""
Text4.Text = ""
sckclient.Close
Command1.Enabled = True
End Sub
至此,服务器和客户端初步完成,试运行正常。
3.3 实现客户端之间的通信
服务器端:
在服务器端创建一个新的工程将其命名为“服务器”。将缺省窗体命名为“服务
器”。在窗体中添加一个 ListBox 控件,将其命名为“ListBox”。