2025年3月7日 星期五 甲辰(龙)年 月初六 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

UDP echo服务器的建立(Python实现)

时间:10-01来源:作者:点击数:40

TCP echo服务器的建立》和《编写简单的TCP客户端》分别介绍了使用 TCP 协议编写 echo 服务的服务器端代码和客户端代码。本节将实现一个 UDP 版的 echo 服务。

虽然 TCP 和 UDP 区别很大,但是从 socket 接口来说它们并没有太大的区别,只是在 socket 创建时需要指定 socket 的不同类型,另外就是读取数据的接口时需要使用不同的接口。

在 UDP 中,最好不要使用 recv 接口,因为 UDP 是没有连接的,所以数据从哪里来是不确定的。也许第一段数据来自机器 A,第二段数据就来自机器 B。所以数据的来源就显得比较重要,使用 recv() 是无法得到发送方的地址信息的,而使用 recvfrom() 就可以得到发送方的地址信息。

发送数据也存在类似的情况。TCP 是有连接的,发送数据自然是将数据发送到另外一端。而 UDP 是没有连接的,所以在发送时需要指定接收人。send() 是不带接收人的,因为接收人在 bind() 时已经指定了。sendto() 是有接收人参数的,这也意味着一个 socket 可以先发送一段数据到机器 A,再发送一段数据到机器 B,这个是 TCP 无法实现的功能。

TCP型的socket只能在某两台机器之间发送数据。

另外一个区别是,现在服务器端不能用前面的连接是否存在来决定是否退出了。所以为了让服务器能够退出,需要给其发送命令 quit,服务器在接收到 quit 命令时即可自动退出,否则就一直坚守岗位,将所接收到的数据发送回去。

下面是服务器端的代码:

  • import socket
  • HOST = ''
  • PORT = 50007
  • # 创建socket实例对象
  • s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  • s.bind((HOST, PORT)) # 绑定本地端口号50007
  • while True: # 循环读取数据
  • data, sender = s.recvfrom(1024) # 接收数据
  • print('Got Data From', sender) # 显示发送者的信息
  • s_data = data.decode("utf-8") # 解码
  • print("Recv [%s] from " % s_data, sender) # 显示数据内容
  • s.sendto(data, sender) # 将接收到的数据送回给发送者
  • if s_data == "quit": # 如果是quit,那么退出
  • print("Got quit message, Echo Server Quit")
  • break
  • s.close() # 关闭socket接口

下面是客户端的代码。

  • import socket
  • HOST = '127.0.0.1' # 发送数据到本地
  • PORT = 50007
  • s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  • data = 'Hello, world' # 希望发送的字符串
  • b_data = data.encode("utf-8") # 编码
  • s.sendto(b_data, (HOST,PORT)) # 发送数据
  • data, sender = s.recvfrom(1024) # 等待服务区的返回数据
  • print('Received: ', data, " From ", sender) # 显示数据的发送方信息
  • data = 'quit' # 发送quit,让服务区退出
  • b_data = data.encode("utf-8")
  • s.sendto(b_data, (HOST,PORT))
  • s.close() # 关闭socket,节省资源

 

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门