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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值