网络通信程序案例(基于VB)—案例2-简易聊天程序

参考文档《计算机网络通信程序设计》—成都文理学院 信息工程学院

网络通信程序案例(基于VB)—案例2-简易聊天程序—贪吃的钊钊黑

指导老师:胡念青

一、任务描述

这是一个基于VB6.0实现的简单聊天程序,它可以实现在局域网中两台主机间的在线聊天。

二、实现效果

说明:
本程序的运行是通过一个第三方实体为启动程序的,通过此实体用户手动选择本方是扮演客户还是扮演服务器,并由此拉开通信的序幕。故此,本程序的测试无法在同一台主机上完成,而必需在两台主机正确联网的环境下才能完成。这是因为第三方实体 启动后,本机不能同时既选择为客户机又选择为服务器主机。

因为疫情的缘故,我并没有在学校上课,家里也只有一台PC,迫使本程序只能在一台电脑上运行,因此运行结果可能和实际有所差异,特此强调。

PC-A-服务器端

张三
你好

PC-B-客户端

在这里插入图片描述
在这里插入图片描述

三、功能描述

  1. 点对点的字符信息简易聊天程序;
  2. 采用 TCP 传输协议,TCP 连接建立后,双方实体即可通过Winsock 控件提供的相关方法收发信息了。

四、实现代码

1. ConnectFRM.frm 连接

Private Sub ClientCMD_Click()
IPtxt.Text = "Server's IP here"
'告诉用户在此处填入服务器IP地址
Me.Caption = "Connect as Client"
IPtxt.Enabled = True
'需要填入服务器地址
nicknameTXT.Enabled = True
'使能暱称
ServerCMD.Enabled = False
'客户端不需要这个按钮了
ClientCMD.Enabled = False
'客户端不需要这个按钮了
ConnectCMD.Enabled = True
'需要这个按钮

End Sub

Private Sub ConnectCMD_Click()
If nicknameTXT.Text = "" Then Exit Sub
'暱称为空则不连接

If Me.Caption = "Connect as Server" Then
'如果是作为服务器连接的话
    ServerFRM.Winsock.Close
    '关闭前面的连接
    ServerFRM.Winsock.LocalPort = 1001
    '187 服务器端口
    ServerFRM.Winsock.Listen
    '侦听
    ServerFRM.nickSERVER.Caption = nicknameTXT.Text
    '暱称一致
End If

If Me.Caption = "Connect as Client" Then
'作为客户端连接
    If IPtxt.Text = "Server's IP here" Then Exit Sub
    '需要填入IP
    If IPtxt.Text = "" Then Exit Sub
    '需要填入IP
    ClientFRM.Winsock.Close
    '关闭前面的连接
    ClientFRM.Winsock.Connect IPtxt.Text, 1001
    '连接服务器, 187为端口号
    ClientFRM.nickCLIENT.Caption = nicknameTXT.Text
    '暱称
End If

End Sub

Private Sub Form_Load()
ConnectCMD.Enabled = False
'连接按钮不可用
YouripLBL.Caption = "Your IP:  " & Winsock.LocalIP
'本地地址
IPtxt.Enabled = False
'IP地址栏不让用
nicknameTXT.Enabled = False

End Sub

Private Sub ServerCMD_Click()
Me.Caption = "Connect as Server"
'窗体标题

IPtxt.Enabled = True
'需要该按钮
nicknameTXT.Enabled = True
'需要该文本框
ServerCMD.Enabled = False
'无需该按钮
ClientCMD.Enabled = False
'无需该按钮
IPtxt.Enabled = False
'无需该文本框
ConnectCMD.Enabled = True
'需要该按钮

End Sub

2. ServerFRM.frm 服务器端

'===========================================================================
'=======================从服务器获取数据==========================
Private Sub Winsock_Close()
    MainTXT.SelText = "Disconnected from Client"
    senddataCMD.Enabled = False 'this wont let you send text anymore since client is disconnected
End Sub
'===========================================================================
'======================允许客户端连接=============================
Private Sub winsock_ConnectionRequest(ByVal requestID As Long)

If Winsock.State <> sckClosed Then Winsock.Close
'关闭连接
Winsock.Accept requestID
'接受新连接

Me.Show
'显示服务器端
Unload ConnectFRM
'隐藏ConnectFRM
Winsock.SendData "C" & nickSERVER.Caption
'发送消息,建立连接以及用户名
ServerFRM.Caption = "Adam's Chat   [Welcome, " & nickSERVER.Caption & "!]"
'renames the form approiately
MainTXT.SelText = "Connected to Client" 'displays that connection worked

End Sub
'===========================================================================
'=======================获得客户端数据==========================
Private Sub winsock_DataArrival(ByVal bytesTotal As Long)
Dim strData, strData2 As String
'存储客户端发来的消息
Call Winsock.GetData(strData, vbString)
'获得信息

strData2 = Left(strData, 1)
'第一个字符,说明该信息的内容属性
strData = Mid(strData, 2)
'信息

If strData2 = "T" Then
    MainTXT.SelText = nickCLIENT.Caption & ":     " & strData & vbCrLf
    'adds the data to the txtbox
End If
If strData2 = "N" Then
    nickCLIENT.Caption = strData
    'loads the client's username from data sent
End If

End Sub
'===========================================================================
'========================发送消息到客户端=========================
Private Sub senddataCMD_Click()
MainTXT.SelText = nickSERVER.Caption & ":     " & dataTXT.Text & vbCrLf
'本地显示
Winsock.SendData "T" & dataTXT.Text
'发送
dataTXT.Text = ""
'清空

End Sub
'===========================================================================

3. ClientFRM.frm 客户端

'======================显示断开========================
Private Sub Winsock_Close()
    MainTXT.SelText = "Disconnected to Server"
    senddataCMD.Enabled = False 'this wont let you send text anymore since server is disconnected
End Sub

'=======================从服务器获取数据==========================
Private Sub winsock_DataArrival(ByVal bytesTotal As Long)
Dim strData, strData2 As String
'客户端存储数据

Call Winsock.GetData(strData, vbString)
'获取数据

strData2 = Left(strData, 1)
'strData2存储strData中的第一个字符
'该字符表示是否为第一条信息

strData = Mid(strData, 2)
'聊天信息

If strData2 = "C" Then
'C字符是约定显示窗体的命令
    nickSERVER.Caption = strData
    '获得服务器用户名
    Me.Show
    '显示客户端
    Unload ConnectFRM
    '关闭连接窗体
    Winsock.SendData "N" & nickCLIENT.Caption
    '向服务器传送客户端的名字
    ClientFRM.Caption = "Adam's Chat Client  [Welcome, " & nickCLIENT.Caption & "!]"
    '设置窗体标题
    MainTXT.SelText = "Connected to Server"
    '添加一行
    '说明已经连上
End If

If strData2 = "T" Then MainTXT.SelText = nickSERVER.Caption & ":     " & strData & vbCrLf
'添加从服务器过来的消息

End Sub
'========================SENDS DATA TYPED TO SERVER=========================
Private Sub senddataCMD_Click()
MainTXT.SelText = nickCLIENT.Caption & ":     " & dataTXT.Text & vbCrLf
'本地显示
Winsock.SendData "T" & dataTXT.Text
'向服务器发送消息
dataTXT.Text = ""
'清空

End Sub

五、程序解析

1.实现过程

本程序包含三个窗体分别是:ConnectFRM、ServerFRM和ClientFRM ,其中 ConnectFRM 即为前述的第三方实体(连接窗体),也是本 VB 程序的启动窗体,通过它我们可以为本机选择扮演的通信角色(客户或服务器),并完成界面分流,即对应不同的角色该窗体界面会发生相应的变化。之后,服务器一方应先单击联接按钮(Connect),使其调用 Winsock控件的 Listen方法来侦听外部网络的连接请求;而客户一方也通过单击此按钮来发出对服务器连接请求。
在程序启动时,只有连接窗体也就是启动窗体 ConnectFRM 被显示 (Show),而真正的聊天窗口(无论是客户还是服务器:ClientFRM、ServerFRM)并未显身。只有当双方用户为其所在的主机选择了通信实体的角色,并完成了后续相关操作(服务器侦听、客户端发出连接请求),且服务器接收了此连接请求后,各自的聊天窗口才自动打开。

2.核心WINSOCK解析

作为这个程序的核心控件WINSOCK,我们来看看它的一些常用属性、事件和方法。利用WinSock控件可以与远程计算机建立连接,并通过用户数据文报协议 (UDP)或者传输控制协议 (TCP)进行数据交换。这两种协议都可以用来创建客户与服务器应用程序。

  1. LocalIP方法:用于返回本地机器的 IP 地址;
  2. LocalPort方法:设置服务器端口;
  3. Connect方法:连接服务器;
  4. Listen方法:侦听;
  5. Close方法:关闭当前连接;
  6. SendData方法:发送一条数据给另一台主机;
  7. GetData方法:获得数据;
  8. DataArrival事件:存储客户端发来的消息。

数据的发送是在键盘事件触发后完成的,其中调用了Winsock 控件的SendData 方法;而数据的接收是在 Winsock 控件的 DataArrival 事件触发后完成的,其中调用了Winsock的 GetData 方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章