1. 首先介绍一下网络应用程序。主要有两类:
一类是实现“在协议标准(RFC或其他标准文档)中所定义的操作”,是开放的网络应用程序,开发者必须遵守协议所规定的规则。因此,不同开发者开发的程序能够交互操作(这些程序需要使用与该协议关联的周知端口号);
另一类是专用的网络应用程序。这种程序所使用的应用层协议没有公开发布,其他独立的开发者将不能开发出与该程序交互的代码(这类程序应避免使用周知端口号)。
2. UDP应用程序
(1)UDP是无连接的,从一个端系统向另一个端系统发送独立的数据分组,不对交付提供任何保证。
(2)如下图所示,使用UDP的两个通信进程之间的交互有以下几个过程:
①发送进程将目的地址附在数据分组之上(目的地址=目的主机IP+目的套接字所在的端口号)【分组上面的源地址由底层操作系统自动填写】
②因特网使用该目的地址为该分组选路到目的进程的套接字;
③接收进程通过该套接字取回分组。
3. 用Python3 实现一个简单的UDP应用程序
(1)应用程序的客户端
#socket 模块形成了在python中所有网络通信的基础
from socket import *
serverName='45.76.204.40' #包含服务器的主机名或IP地址
serverPort=12000 #目标端口号
#使用socket()创建客户套接字。
#第一个参数指示了地址簇:AF_INET指示了底层网络使用了IPv4
#第二个参数,SOCK_DGRAM指示了它是一个UDP套接字(而不是TCP套接字)
#特别注意:我们无需指定客户端套接字的端口号,这个工作由操作系统完成
clientSocket=socket(AF_INET,SOCK_DGRAM)
message=input('Input lowercase sentence:') #提示用户从键盘输入,并将输入读取到message中
#sendto()为报文message附上目的地址(serverName,serverPort),
#并向进程的套接字clientSocket发送结果分组
clientSocket.sendto(message.encode(),(serverName,serverPort))
#来自因特网的分组到达该客户的套接字时,其分组数据放在变量ModifiedMessage中,源地址放置在serverAddress中
#方法recvfrom取长度2048作为输入
ModifiedMessage,serverAddress=clientSocket.recvfrom(2048)
print (ModifiedMessage.decode())
clientSocket.close()
(2)然后是服务器程序:
from socket import *
serverPort=12000
serverSocket=socket(AF_INET,SOCK_DGRAM)
serverSocket.bind(('',serverPort)) #将端口号与服务器的套接字显示绑定在一起
print('The server is ready to receive')
#这个while允许服务器无限期地接收来自客户端的分组
while True:
message,clientAddress=serverSocket.recvfrom(2048)
modifiedMessage=message.upper()
serverSocket.sendto(modifiedMessage,clientAddress)
应该注意的是,如果是用IDLE运行这两个程序的话,应注意为他们各自开启一个进程(即打开两个IDLE):先让服务器程序保持运行状态,然后运行客户程序。