计算机网络原理与技术网络编程基于传输层的网络编程目前大多数计算机网络应用层程序都使用Socket(套接字)进行网络通信。很多操作系统都提供了这种基于TCP/IP网络的应用程序接口,Socket定义了许多函数和例程,可以用它们来开发TCP/IP网络应用程序。端口端口用来惟一的标识主机中的每一个进程,它是传输层中进程的运输地址或进程地址。不同的端口表示实现不同的应用进程。传输层利用端口机制向应用层提供多路复用和多路分解的功能。表1常用端口号和功能端口号网络协议传输层协议说明20FTPTCP用于文件传输协议的数据连接21FTPTCP用于文件传输协议的控制连接25SMTPTCP用于发送邮件的简单邮件传输协议53DNSTCP/UDP用于域名系统80HTTPTCP用于超文本传输协议110POP3TCP用于接收邮件的邮局协议111RPCUDP用于远程调用套接字在TCP/IP网络中,可用IP地址标识每一个主机,再用端口号标识主机中的进程,这样,IP地址+端口号就可以惟一的标识一个进程了。考虑到网络中多协议的特点(如UDP、TCP),要惟一标识一个进程,还应加上协议类型。“协议类型+IP地址+端口号”就是所谓的套接字(Socket)。套接字有了套接字后,就可以方便地使用某个特定主机上的各种网络服务。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议提供了套接字(Socket)接口。Socket接口是TCP/IP网络的应用程序接口,它定义了许多函数和例程,可以用它来开发TCP/IP网络应用程序。WindowsSockets规范1.WindowsSockets套接字Sockets是在UNIX系统上提出来的。Microsoft公司在此基础上建立了WindowsSockets规范。在Windows环境中,Winsock接口成为了一个与特定协议无关的接口。WindowsSockets规范给应用程序开发者提供了一套简单的API(应用程序接口)。此外,WindowsSockets也定义了一个二进制接口,保证WindowsSocketsAPI应用程序能在任何符合WindowsSockets规范的网络软件上进行工作。WindowsSockets规范1.WindowsSockets套接字WindowsSockets规范2.Winsock控件的属性、方法和事件以VisualBasic(以下简称VB)为例,说明网络编程的基本方法。VB提供了一个Winsock控件。Winsock控件是用于将WindowsSockets接口简化成易于使用的VB内部接口,Winsock使用十分方便。当然,Winsock控件并不能完全取代Socket函数,它有一些不足之处,如不支持广播和组播特性。但在基本的网络通信中,Winsock控件仍然是一个很好的工具。WindowsSockets规范2.Winsock控件的属性、方法和事件(1)Winsock控件的属性属性名说明BytesReceived返回接收到的数据的数量,使用GetData方法来获取数据LocalHostName返回本地计算机名LocalIP返回本地计算机的IP地址,且格式为点分十进制表示的字符串LocalPort返回或设置所用到的本地端口Protocol返回或设置Winsock控件所使用的协议,TCP或UDP,默认为TCP协议RemoteHost返回或设置远程计算机的IP地址或域名。IP地址格式为点分十进制RemoteHostIP返回远程计算机的IP地址,且格式为点分十进制表示的字符串RemotePort返回或设置远程端口号State返回控件的状态WindowsSockets规范2.Winsock控件的属性、方法和事件(2)Winsock控件的方法Accept方法Bind方法Close方法GetData方法Listen方法PeekData方法SendData方法WindowsSockets规范2.Winsock控件的属性、方法和事件(3)Winsock控件的事件Close事件Connect事件ConnectionRequest事件DataArrival事件SendComplete事件SendProgress事件Error事件WindowsSockets规范4.Winsock控件的使用方法使用Winsock控件时,由网络应用程序决定使用UDP协议还是TCP协议。利用VB设计网络应用程序时,可在VB的工具箱中找到Winsock控件图标,在控件【属性】窗口中单击【Protocol】,在右边栏目中选择【sckTCPProtocol】或【sckUDPProtocol】。使用程序代码来设置Winsock控件的Protocol属性,例如:Winsock1.Protocol=sckTCPProtocol基于UDP协议的编程1.UDP连接方式的通信规程UDP是面向无连接的协议,即在发送数据之前不必建立连接,只需要将Winsock绑定到一个端口上,其他无连接协议的Winsock如果向本机发送数据,就需要指出地址和端口号。基于UDP协议的编程1.UDP连接方式的通信规程UDP协议不需要显式(设置连接)连接,但是在创建UDP应用程序时,必须调用Bind方法,Bind方法的作用是为控件“保留”一个本地端口,以使其他应用程序不能使用该端口进行通信。在客户与服务器之间发送数据,需要完成以下三步工作(连接的双方)。一是将RemoteHost属性设置为对方计算机的名称或IP地址。二是将RemotePort属性设置为对方计算机Winsock控件所的LocalPort属性。三是调用Bind方法,指定使用的LocalPort。基于UDP协议的编程1.UDP连接方式的通信规程使用UDP协议时,可以任意改变RemoteHost和RemotePort属性,同时保持绑定在同一个LocalPort上。而TCP协议与此不同,在改变RemoteHost和RemotePort属性之前,必须先关闭连接。因为一个UDP应用程序既可以作为服务器也可以作为客户端,所以两台计算机的地位可以看成是“平等”的,这种应用程序也称为点到点程序。基于UDP协议的编程2.A计算机UDP聊天程序设计(1)在VB中创建新的标准EXE工程在Form表单添加6个控件:2个label(标签),用作提示信息;2个text(文本),1个为接收数据,命名为tetArr,1个为发送数据,命名为tetSent;1个command,为退出运行命令;一个重要的Winsock.控件(套接字),命名为winSockA,有关属性在代码中设置。Form表单的caption属性设为“UDPA端,作为程序窗口的标题。基于UDP协议的编程2.A计算机UDP聊天程序设计(2)Winsock控件的程序源代码启动程序,装载表单时设置Winsock控件属性,源代码如下:PrivateSubForm_Load()WithwinSockA//设置Winsock控件的相关属性//.Protocol=sckUDPProtocol//设置UDP协议//.RemoteHost=wlgc-d3//设置远程计算机名//.RemotePort=8000//设置远程计算机端口号//.Bind9000//绑定本地端口号//EndWithEndSub基于UDP协议的编程2.A计算机UDP聊天程序设计(3)在发送文本框输入数据时,由Winsock控件立即将数据发送,源代码如下:PrivateSubtxtSend_Change()winSockA.SendDatatxtSend.Text//在键入文本时,立即发送出去//EndSub(4)Winsock收到数据后,将其放入数据到达文本框显示,源代码如下:PrivateSubwinSockA_DataArrival(ByValbytesTotalAsLong)DimstrDataAsStringwinSockA.GetDatastrData//接收输入的数据//txtArr.Text=strData//在文本框显示接收的数据//EndSub基于UDP协议的编程2.A计算机UDP聊天程序设计(5)要退出程序,关闭winsock控件,解除端口绑定,源代码如下:PrivateSubCommand1_Click()winSockA.Close//关闭winsock控件,解除端口绑定//UnloadMe//退出程序//EndSub基于UDP协议的编程3.B计算机UDP聊天程序设计B端的的程序与A端的几乎一样,只是控件的名称不一样。另外特意在Winsock控件RemoteHost中使用了IP地址。各控件的源代码如下,各语句的作用与A端的程序中一样。PrivateSubCommand1_Click()winSockB.CloseUnloadMeEndSub基于UDP协议的编程3.B计算机UDP聊天程序设计B端的的程序与A端的几乎一样,只是控件的名称不一样。另外特意在Winsock控件RemoteHost中使用了IP地址。基于UDP协议的编程4.聊天程序设计将以上两个程序编译成EXE文件,分别安装到不同的机器上,即可进行两个计算机之间的通信。实际上在同一台计算机上也可以进行通信,只要使用不同的端口号就可以。基于TCP协议的编程TCP协议是面向连接的,在服务器和客户端必须建立连接后才能传输数据。服务器端首先要为Winsock控件设置一个端口号,然后通过调用Winsock控件的Listen方法,使服务器程序在该端口监听客户端的连接请求。客户端首先也要在Winsock控件中,设置好服务器端的IP地址和端口号,还要设置客户端本地的端口号。当客户端向服务器发出连接请求后,服务器在ConnectionRequest事件中调用Accept方法接受请求,从而建立与客户端的连接。只有双方的连接建立后,才能进行数据的互相传输。基于TCP协议的编程1.服务器端程序设计1)在VB中创建新的【标准EXE】工程,放置程序需要的控件。在Form表单添加6个控件:2个label,用作提示信息;2个text,1个为接收数据,1个为发送数据;2个command,1个为发送数据命令cmdSend,1个为退出运行命令cmdQuit;还一个重要的Winsock.控件,命名为sockServer。各控件的程序源代码如下。基于TCP协议的编程1.服务器端程序设计(1)启动程序,装载表单时设置Winsock控件属性,源代码如下:PrivateSubForm_Load()sockServer.Protocol=sckTCPProtocol//设置TCP协议//sockServer.LocalPort=5000//服务器端口号,最好大于1000//sockServer.Listen//开始侦听//EndSub基于TCP协议的编程1.服务器端程序设计(2)“退出”命令按钮的click事件,源代码如下:PrivateSubcmdQuit_Click()UnloadMeEndSub(3)“发送”命令按钮的click事件,源代码如下:PrivateSubcmdSend_Click()sockServer.SendDataText2.TextEndSub基于TCP协议的编程1.服务器端程序设计(4)表单卸载时要关闭winsock控件:PrivateSubForm_Unload(CancelAsInteger)sockServer.CloseEndSub(5)Winsock控件的close事件,源代码如下:PrivateSubsockServer_Close()sockServer.CloseEndSub基于TCP协议的编程1.服务器端程序设计(6)客户端的连接请求到达时,会触发Winsock控件的ConnectionRequest事件,事件处理源代码如下:PrivateSubsockServer_ConnectionRequest(ByValrequestIDAsLong)//当收到连接请求时,Winsock处于侦听状态///