
实验基于网络通信协议的设计[详细].ppt
18页实验三实验三 基于网络通信协议的设计基于网络通信协议的设计一、实验目的一、实验目的¨了解通信协议的基本工作原理了解通信协议的基本工作原理¨了解了解Winsock的编程方法的编程方法¨设计一个简单基于通信协议的应用程序设计一个简单基于通信协议的应用程序二、实验说明二、实验说明¨InternetInternet是国际性的通信网络的集合体,它集是国际性的通信网络的集合体,它集现代通信技术和现代计算机技术于一体,是计现代通信技术和现代计算机技术于一体,是计算机之间进行国际信息交流和实现资源共享的算机之间进行国际信息交流和实现资源共享的良好手段良好手段¨InternetInternet提供各种各样的服务:提供各种各样的服务:TelnetTelnet、、FTPFTP、、电子邮件、网络新闻服务、文档查询索引服务电子邮件、网络新闻服务、文档查询索引服务及其它信息服务及其它信息服务¨InternetInternet上信息传递基于上信息传递基于TCP/IPTCP/IP((传输控制协传输控制协议议/ /互联网协议)协议互联网协议)协议网络编程网络编程¨WindowsWindows网络编程网络编程¨UNIXUNIX网络编程网络编程¨JAVAJAVA网络编程网络编程¨WebWeb客户客户/ /服务器端编程服务器端编程WindowsWindows网络编程网络编程¨WindowsWindows环境下的环境下的InternetInternet编程主要是进行编程主要是进行SocketsSockets编程。
编程¨WinsockWinsock是是Microsoft WindowsMicrosoft Windows提供的网络编程提供的网络编程接口,它提供了基于接口,它提供了基于TCP/IPTCP/IP协议的接口实现方协议的接口实现方法TCP/IPTCP/IP的结构的结构¨通过网路进行数据通信,需要用地址来标识网路中的通过网路进行数据通信,需要用地址来标识网路中的主机,这样才能保证数据正确的发送到主机主机,这样才能保证数据正确的发送到主机TCP/IP协议使用协议使用IP地址作为网络中主机的标识,而且每台主地址作为网络中主机的标识,而且每台主机的机的IP地址是唯一的,从而实现通过地址是唯一的,从而实现通过IP地址建立彼此地址建立彼此之间的联系通常情况下,由于每台主机上运行不止之间的联系通常情况下,由于每台主机上运行不止一个应用程序,所以为使应用程序间建立连接,还需一个应用程序,所以为使应用程序间建立连接,还需要一个地址标识在要一个地址标识在TCP/IP协议中使用端口(协议中使用端口(Port))来作为主机上运行的应用程序的标识号因此,来作为主机上运行的应用程序的标识号因此,TCP/IP协议中一个有效的网络地址包括协议中一个有效的网络地址包括IP地址和端口地址和端口地址。
地址¨TCP/IPTCP/IP协议提供两种同其它主机进行通信的协议提供两种同其它主机进行通信的方式:方式:TCPTCP方式和方式和UDPUDP方式方式¨TCPTCP方式:方式:是一种面向连接的服务,它在两个主机是一种面向连接的服务,它在两个主机间建立连接,提供双向、有序且无重复的数据流间建立连接,提供双向、有序且无重复的数据流服务,以及流量控制、差错检测和纠错等服务,服务,以及流量控制、差错检测和纠错等服务,保证数据的可靠传输保证数据的可靠传输¨UDPUDP方式:方式:是一种双向的无连接数据服务,它把数是一种双向的无连接数据服务,它把数据发送出去但并不进行差错控制和检查,所以不据发送出去但并不进行差错控制和检查,所以不能保证数据可靠性,因而用于少量数据的传输能保证数据可靠性,因而用于少量数据的传输三、实验内容三、实验内容¨利用利用Winsock控件编写控件编写TCP应用程序或者应用程序或者UDP应用程序应用程序WinsockWinsock简介简介¨WinsockWinsock控件属性控件属性¨Bytereceived Bytereceived 接受到的数据字节数接受到的数据字节数¨LocalHostName LocalHostName 本地主机名本地主机名 ¨LocalIP LocalIP 本地本地IPIP地址地址¨LocalPort LocalPort 本地机器通信程序的端口本地机器通信程序的端口¨RemoteHost RemoteHost 远程机器名远程机器名¨RemoteHostIP RemoteHostIP 远程机器的远程机器的IPIP地址地址¨RemotePort RemotePort 远程通信端口地址远程通信端口地址¨SocketHandle SocketHandle 提供给调用提供给调用Winsock APIWinsock API的句柄参数的句柄参数¨State State 连接的当前状态连接的当前状态¨Protocol Protocol 设置使用的协议设置使用的协议TCPTCP或或UDPUDPStateState连接状态连接状态¨StateState常数常数 值值 描述描述 sckclosed 0 sckclosed 0 关闭状态关闭状态 sckopen 1 sckopen 1 打开状态打开状态 scklistening 2 scklistening 2 监听状态监听状态 sckconnectionsuspending 3 sckconnectionsuspending 3 连接挂起连接挂起 sckresolvinghost 4 sckresolvinghost 4 解析域名解析域名 sckconneting 5 sckconneting 5 正在连接正在连接 sckconnected 6 sckconnected 6 已建立连接已建立连接 sckclosing 7 sckclosing 7 正在关闭正在关闭 sckerror 8 sckerror 8 出错出错WinsockWinsock控件方法控件方法¨AcceptAccept方法方法 用于接收一个连接请求。
在用用于接收一个连接请求在用TCPTCP建立连接时,当有连建立连接时,当有连接请求到来就用此方法接受请求以建立连接接请求到来就用此方法接受请求以建立连接 调用格式:调用格式:winsockwinsock对象对象.Accept Request ID.Accept Request ID¨BindBind方法方法 在存在多协议接口卡的情况下,用此方法把接口卡和在存在多协议接口卡的情况下,用此方法把接口卡和IPIP地址捆绑在一起地址捆绑在一起 调用格式:调用格式:winsockwinsock对象对象.Bind .Bind 端口号,端口号,IPIP地址地址¨CloseClose方法方法 关闭一个关闭一个TCPTCP连接调用格式:连接调用格式:winsockwinsock对象对象.close.close¨ConnectConnect方法方法 用于向远程主机发出连接请求用于向远程主机发出连接请求 调用格式:调用格式:winsockwinsock对象对象.connect[.connect[远程主机远程主机IP,IP,远程端口远程端口] ]¨GetDataGetData和和PeekDataPeekData方法方法 都是用来取得接收到的数据。
都是用来取得接收到的数据GetDataGetData取回后要清除接取回后要清除接收缓冲区,收缓冲区,PeekDataPeekData不清除接收缓冲区不清除接收缓冲区 调用格式:调用格式:winsockwinsock对象对象.getdata(peekdata).getdata(peekdata)变量变量[ [,, 数据类型数据类型[ [,最大长度,最大长度]]]]¨ListenListen方法方法 用于服务器程序,等待客户访问用于服务器程序,等待客户访问 调用格式:调用格式:winsockwinsock对象对象.listen.listen¨SendDataSendData方法方法 用于发送数据,可用在用于发送数据,可用在TCPTCP和和UDPUDP两种方式下两种方式下 调用格式:调用格式:winsockwinsock对象对象.SendData .SendData 数据数据WinsockWinsock控件事件控件事件¨CloseClose事件事件 当远程计算机关闭连接时出现当远程计算机关闭连接时出现¨ConnectConnect事件事件 当一个当一个ConnectConnect操作完成时发生。
使用操作完成时发生使用ConnectConnect事件确事件确认已经成功建立了一个连接认已经成功建立了一个连接¨ConncetRequestConncetRequest事件事件 当远程计算机请求连接时出现,仅适用于当远程计算机请求连接时出现,仅适用于TCPTCP服务器应用程序在服务器应用程序在请求一个新连接时激活该事件激活事件之后,请求一个新连接时激活该事件激活事件之后,RemoteHostIPRemoteHostIP和和RemotePortRemotePort属性存储有关客户的信息服务器可决定是否接受连属性存储有关客户的信息服务器可决定是否接受连接参数:接参数:repuestIDrepuestID为连接请求标识)为连接请求标识)¨DaDataArrivaltaArrival事件事件 当新数据到达时出现当新数据到达时出现¨ErrorError事件事件 发生错误时出现发生错误时出现¨SendProgressSendProgress事件事件 在发送数据期间出现在发送数据期间出现¨SendCompleSendComple事件事件 在完成一个发送操作时出现在完成一个发送操作时出现。
例:列车时刻表显示例:列车时刻表显示¨服务器程序负责提供列车时刻表数据,客户端程序负服务器程序负责提供列车时刻表数据,客户端程序负责显示服务器所传递的内容责显示服务器所传递的内容¨整个过程有下列步骤组成:整个过程有下列步骤组成: 1)服务器工作,聆听客户请求;)服务器工作,聆听客户请求; 2)客户请求建立连接;)客户请求建立连接; 3)服务器响应,建立连接;)服务器响应,建立连接; 4)客户请求时刻表数据;)客户请求时刻表数据; 5)服务器接受请求,发送数据给客户;)服务器接受请求,发送数据给客户; 6)客户接受数据,进行显示并请求下一个数据客户接受数据,进行显示并请求下一个数据四、实验要求四、实验要求¨确定应用程序的内容确定应用程序的内容¨原理说明原理说明¨详细的设计思路及工作流程详细的设计思路及工作流程¨程序设计及程序清单程序设计及程序清单¨设计总结设计总结¨参考文献参考文献(3-4参考资料参考资料)¨ 先在一台计算机上运行服务器程序,此时窗口上只有一个先在一台计算机上运行服务器程序,此时窗口上只有一个“退出退出”按钮 再在另一台计算机上运行客户机程序,在再在另一台计算机上运行客户机程序,在“连接连接”按钮右边的文本框中输入服务器按钮右边的文本框中输入服务器 的主的主机名后单击机名后单击“连接连接”按钮。
如果连接成功,则服务器和客户机程序窗口都会出现两个文本框这时,两端都可以在上面的文本框中输入文字,这些文字会立即在下按钮如果连接成功,则服务器和客户机程序窗口都会出现两个文本框这时,两端都可以在上面的文本框中输入文字,这些文字会立即在下面的文本框中出现面的文本框中出现 服务器程序使用的控件如下:服务器程序使用的控件如下: ((1))Command1:退出按钮;:退出按钮; ((2))textsend:发送数据文本框;:发送数据文本框; ((3))Winsockserver:: 服务器服务器Winsock;; ((4))textget :接收数据文本框接收数据文本框 服务器程序的界面如图所示服务器程序的界面如图所示 服务器程序的源代码如下:服务器程序的源代码如下: Private Sub Command1_Click() End End Sub Private Sub Form_Load() textsend.Visible = False textget.Visible = False Winsockserver.LocalPort = 1001 Winsockserver.Listen End Sub Private Sub textsend_Change() Winsockserver.SendData textsend.Text End Sub Private Sub Winsockserver_Close() Winsockserver.Close End End Sub Private Sub Winsockserver_ConnectionRequest(ByVal requestID As Long) textsend.Visible = True textget.Visible = True If Winsockserver.State <> sckClosed Then Winsockserver.Close Winsockserver.Accept requestID End Sub Private Sub Winsockserver_DataArrival(ByVal bytesTotal As Long) Dim tmpstr As String Winsockserver.GetData tmpstr textget.Text = tmpstr End Sub 客户机程序使用的控件如下:客户机程序使用的控件如下: ((1))Command1:退出按钮;:退出按钮; ((2))Command2:连接按钮;:连接按钮; ((3))Winsockclient:客户:客户Winsock;; ((4))Text1:主机名文本框;:主机名文本框; ((5))Textsend:发送数据文本框;:发送数据文本框; ((6))Textget:接收数据文本框;:接收数据文本框; 客户机程序的界面如图所示。
客户机程序的界面如图所示 客户机程序的源代码如下:客户机程序的源代码如下: Private Sub Command1_Click() End End Sub Private Sub Command2_Click() Winsockclient.Connect End Sub Private Sub Form_Load() textsend.Visible = False textget.Visible = False Winsockclient.RemotePort = 1001 Winsockclient.RemoteHost = "sccdsz" End Sub Private Sub Text1_Change() Winsockclient.RemoteHost = Text1.Text End Sub Private Sub textsend_Change() Winsockclient.SendData textsend.Text End Sub Private Sub Winsockclient_Close() Winsockclient.Close End End Sub Private Sub winsockclient_Connect() textsend.Visible = True textget.Visible = True Command2.Visible = False End Sub Private Sub winsockclient_DataArrival(ByVal bytesTotal As Long) Dim tmpstr As String Winsockclient.GetData tmpstr textget.Text = tmpstr End Sub 。
