【Python】一个简单的UDP小实验

 简介

    这是一个UDP套接字编程案例。分别包含客户端的代码和服务端的代码,客户端创建UDP连接并向服务器端发送一个字符串,服务端将其转化成大写。

代码解读

客户端

第一行将变量 serverName 置为字符串" hostname" 这里,我们提供了或者包含服务 器的 IP 地址(如 44.128. 138. 32. 126") 或者包含服务器的主机名(如 "cis poly. edu") 字符串 如果我们使用主机名,则将自动执行 DNS lookup 从而得到 IP 地址 第二行将整数变量 serverPort 置为 12000 

下一行行创建了客户的套接字,称为 clienLSocket 第一个参数指示了地址簇 特别是, AF_INET 指示了底层网络使用了 IPv4 (此时不必担心,我们将在第 章中讨论 IPv 第二个参数指示了该套接字是 SOCK_DGRAM 类型的,这意味着它是一个 UDP 套接字( 不是一个 TCP 套接字) 值得注意的是,当创建套接字时,我们并没有指定客户套接字的端口号;相反,我们让操作系统为我们做这件事。

在上述这行中,我们首先将报文由字符串类型转换为字节类型,因为我们需要向套 接字 中发送字节;这将使用 encode ()方法,方法 sendto ()为报文附上目的 (serverName , server Port 并且向进程的套接字 clientSocket 发送结果分组 (如前面所述,源地址也附到分组上,尽管这是自动完成的,而不是显式地由代码完成 )

对于上述这 个来自因特网的分组到达该客户套接字时,该分组的数据被放 置到变量 modified essage 中,其源地址被放置到变量 serverAddres,serverAddress包含了服务器的 IP 地址和服务器的端口号,程序 UDPClient 实际上并不需要服务器地址信息,因为它从起始就已经知道了该服务器地址;而这行 Python 代码仍然提供了服务器的地址方法 recvfrom() 截取缓存长度 2048 作为输入 (该缓存长度用于多种目的)

服务端

现在来看看这个应用程序的服务器端:

注意到 UDPServer 的开始部分与 UDPClient 类似 它也是导人套接字模块 ,也将整数变量 serverPort 设置为 12000, 并且也创建套接字类型 SOCK DGRAM UDP 套接字)。将端口号 2000 与该服务器的套接字绑定(即分配)在一起 DPS er 中,(由应用程序开发者编写的)代码显式地为该套接字分配一个端口号 以这种方 当任何人向位千该服务器的 IP 地址的端口 12000 发送一个分组,该分组将导向该套接字 UDPServer 然后进入 while 循环;该 while 循环将允许 UDPServer 无限期地接收并处理 来自客户的分组 在该 while 循环中, UDPServer 等待一个分组的到达。

最后一行将该客户的地址 iP 地址和端口号)附到大写的报文上(在将字符串转化为字节后),并将所得的分组发送到服务器的套接字中 (如前面所述,服务器地址也附在分组上,尽管这是自动而不是显式地由代码完成的 )然后因特网将分组付到该客户地在服务器发送该分组后,它仍维持在 while 循环中等待(从运行在任一台主机上的 任何客户发送的)另一个 UDP 分组到达。

Q:我只有一台电脑,怎么测试?

A:在设置-网络和Internet中找到自己的IPV4地址,将其设置为客户端的serverName,一台电脑即是客户端也是服务端。

Client端

from socket import *
serverName = '192.168.3.31' #填入Server的IP地址
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_DGRAM)
message = input('please input the sentence you want to turn into uppercase')
clientSocket.sendto(message.encode(),(serverName,serverPort))
modifiedMessage,serverAddress = clientSocket.recvfrom(2048)
print(modifiedMessage.decode())
clientSocket.close()

Server端

from socket import *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort))
print("The server is ready to receive")
while True:
    message, clientAddress = serverSocket.recvfrom(2048)
    modifiedMessage = message.decode().upper()
    serverSocket.sendto(modifiedMessage.encode(), clientAddress)

总结

为了测试这对程序,可在一台主机上运行 UDPClient. py, 并在另一台主机上运行 UDPServer. py 保证在 UDPClient. py 中包括适当的服务器主机名或 IP 地址。接下来,在服务器主机上执行编译的服务器程序 UDPServer. py 这在服务器上创建了 个进程,等待着某个客户与之联系 然后,在客户主机上执行编译的客户器程序 DPClient. py 在客户上创建了个进程。最后,在客户上使用应用程序,键入一个句子并 以回车 结束 可以通过稍加修改上述客户和服务器程序来研制自己的 UDP 客户-服务器程序。例如,不必将所有字母转换为大写,服务器可以计算字母出现的次数并返回该数字 或者能够修改客户程序,使其在收到一个大写的句子后,用户能够向服务器继续发送更多的句子

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值