实现UDP套接字编程整理《计算机网络——自顶向下方法(James F. Kurose, Keith W. Rose)》

xiaoxiao2021-02-28  19

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):先让服务器程序保持运行状态,然后运行客户程序。

转载请注明原文地址: https://www.6miu.com/read-2150111.html

最新回复(0)