1实验目的和要求
1) 学习网络中进程之间通信的原理和实现方法;
2) 掌握在VB或VC++等集成开发环境中编写网络程序的方法;
3)编写一个简单的聊天程序:最低要求实现两人一组的两台计算机之间的收发文本及其显示;
2实验设备及分组
1) Windows2000以上操作系统;
2) VB和Visual C++ 6.0语言环境;
3) 每人一台PC机。
3实验内容和步骤
3.1设计服务器界面
打开vb程序,新建一个工程,取名为server。在窗体中添加控件。将Winsock控件放入到窗体里,名称属性改为Winsockserver。在窗体里建立两个按钮,command1的caption属性为发送,command2的caption属性为退出。建立两个richtextbox,richtextbox1的名称属性改为textget,ScrollBars属性改为3-rtfBoth,Locked属性改为True,richtextbox2的名称属性改为textsend,ScrollBars属性改为3-rtfBoth。然后建立两个label,caption属性改为接受窗口和发送窗口。如图3-1所示。
图3-1 服务器界面
3.2设计客户端界面
先建立一个工程,取名为client。在窗体中加入控件:将Winsock控件添加到窗体里,名称属性改为winsockclient。建立两个richtextbox,richtextbox1的名称属性改为textget,ScrollBars属性改为3-rtfBoth,Locked属性改为True,richtextbox2的名称属性改为textsend,ScrollBars属性改为3-rtfBoth。在窗体里建立三个按钮,command1的caption属性为发送,command2的caption属性为退出,command3的caption属性为连接。建立一个text。再建立三个Lable,caption属性分别为主机名,接收和发送,如图3-2所示。
图3-2 客户端界面
3.3编写程序及其说明
3.3.1服务器程序
Private Sub Command1_Click() ’发送选项
Dim a As String
a = "服务器:"
Winsockserver.SendData "(" & Time & ")" & vbCrLf & textsend.Text
textget.Text = textget.Text & a & "(" & Time & ")" & vbCrLf & textsend.Text & vbCrLf ‘可自动换行,并有时间显示
textsend.Text = "" ‘发送完毕后,文本框自动清空
End Sub
Private Sub Command2_Click()’退出后结束运行
End
End Sub
Private Sub Form_Load()‘窗体加载时,发送文本框与接收文本框不可见
textsend.Visible = False‘发送信息文本框不可见
textget.Visible = False‘接收信息文本框可见
Winsockserver.LocalPort = 1001‘服务器端口号设置
Winsockserver.Listen‘服务器侦听
End Sub
Private Sub Winsockserver_Close()
Winsockserver.Close‘关闭服务器
End Sub
Private Sub Winsockserver_ConnectionRequest(ByVal requestID As Long) ‘连接后,WinSock控件工作
textsend.Visible = True
textsend.Text = "" ‘清空文本框信息
textget.Visible = True
textget.Text = ""
If Winsockserver.State <> sckClosed Then Winsockserver.Close‘如果socket没有关闭,则关闭socket
Winsockserver.Accept requestID‘服务器接受请求,接受以后双方才能发送数据
MsgBox ("连接SERVER成功!")
End Sub
Private Sub Winsockserver_DataArrival(ByVal bytesTotal As Long)‘信息接收
Dim tmpstr As String
Dim a As String
a = "客户端:"
Winsockserver.GetData tmpstr
textget.Text = textget.Text & a & tmpstr & vbCrLf
End Sub
3.3.2客户端程序
Private Sub Command1_Click()
winsockclient.Connect
End Sub
Private Sub Command2_Click()’ 连接,且Shape控件显示连接状态
Dim aa As String
aa = "客户端:"
winsockclient.SendData "(" & Time & ")" & vbCrLf & textsend.Text
textget.Text = textget.Text & aa & "(" & Time & ")" & vbCrLf & textsend.Text &
vbCrLf
textsend.Text = ""
End Sub
Private Sub Command3_Click()
End
End Sub
Private Sub Form_Load() ‘程序加载,文本框不可见
Text1.Text = "这里输入要连接的服务器的IP" ‘提示输入ip地址
textsend.Visible = False
textget.Visible = False
winsockclient.RemotePort = 1001’客户端端口号设置为1001
winsockclient.RemoteHost = ""
End Sub
Private Sub Text1_Change()
winsockclient.RemoteHost = Text1.Text‘客户端验证主机名
End Sub
Private Sub winsockclient_Close()‘关闭客户端
winsockclient.Close
End Sub
Private Sub winsockclient_Connect()‘客户端连接
textsend.Visible = True
textsend.Text = ""
textget.Visible = True
textget.Text = ""
Command2.Visible = True
MsgBox ("连接SERVER成功!")
End Sub
Private Sub winsockclient_ConnectionRequest(ByVal requestID As Long)
textsend.Visible = True
textsend.Text = ""
textget.Visible = True
textget.Text = ""
If Winsockserver.State <> sckClosed Then Winsockserver.Close‘如果socket没有关闭,则关闭socket
Winsockserver.Accept requestID
End Sub
Private Sub winsockclient_DataArrival(ByVal bytesTotal As Long)‘信息接收
Dim tmpstr As String
Dim a As String
a = "服务器:"
winsockclient.GetData tmpstr
textget.Text = textget.Text & a & tmpstr & vbCrLf
End Sub
3.4 运行程序
3.4.1 客户端运行结果
图3-3 客户端连接
运行后,填写要连接的主机的IP地址,点击连接,成功后,会提示连接服务器成功。点击确定,双方就可以进行通信。
图3-4 客户端信息接收
双方之间正常通信,接收端能显示信息内容和时间。
3.4.2 服务器运行结果
图3-5 服务器连接
经过客户端输入服务器的IP地址,若正常连接,服务器会提示连接成功。之后就可以进行双方的通信。
图3-6 服务器接收信息
与客户端一样,只要连接成功,双方就能实现正常通信。
4 实验结果分析
网络数据传输可以分为UDP(User Datagram Protocol,用户数据报协议)和TCP(Transmission Control Protocol,传输控制协议),这两种协议的差别在于他们的连接状态,TCP是一种有连接的协议,文件在传输时会先行建立连接,通过连接可确保文件传输的正确性;UDP是一种无连接的的协议,他在传输文件是不能确保传输端的文件能够正确无误的传送到接受端,所以当用户使用UDP协议时,通常要自己做接收确认工作。操作系统提供的Winsock控件可以提供以上两种传输功能。
服务器程序的实现过程是: (1)服务器程序必须设置好LocalPort属性,作为侦听端口,该值为一个整数(只要是一个其它TCP/IP应用程序没有使用过的值即可)。 (2)使用Listen方法进入侦听状态,等待客户机程序的连接请求。 (3)客户机程序发出连接请求,使服务器程序产生ConnectionRequest事件,该事件得到一个参数requestID。 (4)服务器程序用Accept方法接受客户机程序的requestID请求。这样,服务器程序就可以用SendData方法发送数据了。Accept方法必须用上一步得到的requestID作为其参数。 (5)当服务器程序接收到数据时,产生DataArrival事件,参数BytesTotal包含接收到的数据字节数。在该事件中,可以用GetData方法接收数据。 (6)如果接受到Close事件,则用Close方法关闭TCP/IP连接。
客户机程序的实现过程是: (1) 客户程序设置Remotehost属性,以便指定运行服务器程序的主机名,该字符串可在“控制面板|网络|标识|计算机名”中查到。 (2) 设置RemotePort属性,以便指定服务器程序的侦听端口。 (3)使用Connect方法,向服务器提出连接请求。 (4)服务器接受客户机程序的请求,客户机程序产生Connect事件,就可以用SendData方法发送数据了。 (5)当客户机程序接收到数据时,产生DataArrival事件,参数BytesTotal包含接收到的数据字节数。在该事件中,可以用GetData方法接收数据。 (6)如果接受到Close事件,则用Close方法关闭连接。
在使用 WinSock 控件时,首先需要考虑使用什么协议。可以使用的协议包括 TCP 和 UDP。两种协议之间的重要区别在于它们的连接状态:TCP 协议控件是基于连接的协议,可以将它同电话系统相比。在开始数据传输之前,用户必须先建立连接。 UDP 协议是一种无连接协议,两台计算机之间的传输类似于传递邮件:消息从一台计算机发送到另一台计算机,但是两者之间没有明确的连接。另外,单次传输的最大数据量取决于具体的网络。
本应用程序使用 TCP 协议,那么首先必须决定应用程序是服务器还是客户端。如果要创建一个服务器端,那么应用程序需要“监听”指定的端口。当客户端提出连接请求时,服务器端能够接受请求并建立连接。在连接建立之后,客户端与服务器端可以自由地互相通讯。在使用 UDP 协议的时候,可以任意地改变 RemoteHost 和 RemotePort 属性,同时始终保持绑定在同一个 LocalPort 上。TCP 协议与此不同,在改变RemoteHost和 RemotePort 属性之前,必须先关闭连接。
5 实验体会
对基于socket的设计,任意的编程语言可以适用。由于通信专业所学编程语言比较少,再加上本人对C和C++语言编程了解的不多。因此,我选择了VB语言。 选择设计语言后,稍微复习了VB语言的一些知识,尽管这样,但我还是没有比较清楚的设计思路.因此,我还不断地查阅资料,学习别人的设计思路和方法,然后结合自己的想法将程序不断地完善.这样我的程序设计得以顺利地进行。
这次实验使我对书本上的知识有了更深的理解,特别是对于Winsocket的相关原理有了更深的了解,除此之外,我还对套接字、端口、IP地址之间的关系有了初步的理解, 在以后的实验中,我会更加对书上的代码进行研究,充分的理解其中的关键要素。下载本文