使用UDP套接字搭建
文章目录
- 使用UDP套接字搭建
- 前言
- 一、基本结构
- 二、使用步骤
- 1.服务器端
- 2.客户端
- 三、效果展示
- 总结
前言
这次较上个版本《Python 网络编程之搭建简易服务器和客户端》https://only-me.blog.csdn.net/article/details/135251171增加了:
- UDP协议来进行通信,服务器在收到客户端发来的消息时候,会标注上是哪个IP+Port发来的什么消息。
- 当客户端发送某个关键字给到服务器,服务器收到后会主动断开与客户端的连接。
一、基本结构
需要新建两个py文件,一个用来运行服务器端,一个用来运行客户端。进行测试时,需要保证服务器端和客户端都在运行。
二、使用步骤
1.服务器端
代码如下:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('', 25555))
print('[+] Server started........')
while True:
try:
data, client_addr = s.recvfrom(1024)
print('[+] From: ', client_addr)
print('[+] Received: ', data.decode('utf-8'))
message = data.decode('utf-8')
s.sendto(message.encode('utf-8'), client_addr)
if message == '0':
break
except KeyboardInterrupt:
break
print('[+] Server Close.........')
s.close()
可能看不懂的代码解释如下:
- socket.socket(socket.AF_INET, socket.SOCK_DGRAM):创建一个基于IPv4(socket.AF_INET)的UDP(socket.SOCK_DGRAM)类型套接字。UDP是一种无连接、不可靠的数据报协议。
- s.bind((‘’, 25555)):使用bind()方法将服务器套接字绑定到本地主机上的特定端口,这里的地址是空字符串 ‘’ 表示服务器将监听所有可用的网络接口(即任意IP地址),端口号为25555。
- data, client_addr = s.recvfrom(1024):在循环内部,尝试接收来自客户端的最大1024字节的数据,并获取客户端的地址信息。recvfrom() 方法是UDP套接字特有的,可以同时返回数据和发送方地址。
- s.sendto(message.encode(‘utf-8’), client_addr):将接收到的消息解码后重新赋值给变量message,然后将其编码回UTF-8格式并发送回客户端。这里体现了UDP的“请求-响应”模式。
- if message == ‘0’::如果接收到的消息内容是’0’,则跳出循环,关闭服务。
2.客户端
代码如下:
import socket
c = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
try:
message = input("please input:")
c.sendto(message.encode('utf-8'), ('127.0.0.1', 25555))
data, server_address = c.recvfrom(1024)
print(data.decode('utf-8'))
except KeyboardInterrupt:
break
c.close()
可能看不懂的代码解释如下:
- socket.socket(socket.AF_INET, socket.SOCK_DGRAM):创建一个基于IPv4(socket.AF_INET)的UDP(socket.SOCK_DGRAM)类型套接字。UDP是一种无连接、不可靠的数据报协议。
- c.sendto(message.encode(‘utf-8’), (‘127.0.0.1’, 25555)):将用户输入的消息编码为UTF-8格式后通过UDP套接字发送至服务器,服务器地址为’127.0.0.1’,端口号为25555。
- data, server_address = c.recvfrom(1024):使用 recvfrom() 方法等待从服务器接收最多1024字节的数据,并获取服务器的地址信息。由于UDP是无连接的,所以每次都需要通过这种方式获取响应。
- except KeyboardInterrupt::如果在上述操作过程中捕获到键盘中断(即用户按下Ctrl+C),则跳出循环,停止客户端程序。
- c.close():在循环结束后关闭客户端套接字,释放系统资源。
三、效果展示
总结
服务器端代码:
该代码创建了一个UDP服务器,监听本地主机(所有网络接口)的25555端口。服务器在接收到客户端发送的消息后,将接收到的消息原样返回给客户端。当服务器接收到消息内容为’0’时,会跳出循环并关闭服务。
客户端代码:
该代码创建了一个UDP客户端,它不断接收用户的输入,并将输入的消息发送至服务器(127.0.0.1:25555)。然后,客户端等待服务器的响应并打印出来。如果用户按下Ctrl+C,则客户端将停止运行并关闭连接。