UDP套接字搭建简易服务器与客户端

使用UDP套接字搭建



前言

这次较上个版本《Python 网络编程之搭建简易服务器和客户端》https://only-me.blog.csdn.net/article/details/135251171增加了:

  1. UDP协议来进行通信,服务器在收到客户端发来的消息时候,会标注上是哪个IP+Port发来的什么消息。
  2. 当客户端发送某个关键字给到服务器,服务器收到后会主动断开与客户端的连接。

一、基本结构

需要新建两个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()

可能看不懂的代码解释如下:

  1. socket.socket(socket.AF_INET, socket.SOCK_DGRAM):创建一个基于IPv4(socket.AF_INET)的UDP(socket.SOCK_DGRAM)类型套接字。UDP是一种无连接、不可靠的数据报协议。
  2. s.bind((‘’, 25555)):使用bind()方法将服务器套接字绑定到本地主机上的特定端口,这里的地址是空字符串 ‘’ 表示服务器将监听所有可用的网络接口(即任意IP地址),端口号为25555。
  3. data, client_addr = s.recvfrom(1024):在循环内部,尝试接收来自客户端的最大1024字节的数据,并获取客户端的地址信息。recvfrom() 方法是UDP套接字特有的,可以同时返回数据和发送方地址。
  4. s.sendto(message.encode(‘utf-8’), client_addr):将接收到的消息解码后重新赋值给变量message,然后将其编码回UTF-8格式并发送回客户端。这里体现了UDP的“请求-响应”模式。
  5. 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()

可能看不懂的代码解释如下:

  1. socket.socket(socket.AF_INET, socket.SOCK_DGRAM):创建一个基于IPv4(socket.AF_INET)的UDP(socket.SOCK_DGRAM)类型套接字。UDP是一种无连接、不可靠的数据报协议。
  2. c.sendto(message.encode(‘utf-8’), (‘127.0.0.1’, 25555)):将用户输入的消息编码为UTF-8格式后通过UDP套接字发送至服务器,服务器地址为’127.0.0.1’,端口号为25555。
  3. data, server_address = c.recvfrom(1024):使用 recvfrom() 方法等待从服务器接收最多1024字节的数据,并获取服务器的地址信息。由于UDP是无连接的,所以每次都需要通过这种方式获取响应。
  4. except KeyboardInterrupt::如果在上述操作过程中捕获到键盘中断(即用户按下Ctrl+C),则跳出循环,停止客户端程序。
  5. c.close():在循环结束后关闭客户端套接字,释放系统资源。

三、效果展示

在这里插入图片描述


总结

服务器端代码:
该代码创建了一个UDP服务器,监听本地主机(所有网络接口)的25555端口。服务器在接收到客户端发送的消息后,将接收到的消息原样返回给客户端。当服务器接收到消息内容为’0’时,会跳出循环并关闭服务。

客户端代码:
该代码创建了一个UDP客户端,它不断接收用户的输入,并将输入的消息发送至服务器(127.0.0.1:25555)。然后,客户端等待服务器的响应并打印出来。如果用户按下Ctrl+C,则客户端将停止运行并关闭连接。

最近更新

  1. TCP协议是安全的吗?

    2023-12-31 23:44:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-31 23:44:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-31 23:44:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-31 23:44:03       20 阅读

热门阅读

  1. 致最后【个人】

    2023-12-31 23:44:03       34 阅读
  2. Python面向对象-类与对象

    2023-12-31 23:44:03       39 阅读
  3. 使用mysqldump命令备份数据库

    2023-12-31 23:44:03       41 阅读
  4. conn.setAutoCommit()实现事务的控制用法及作用

    2023-12-31 23:44:03       40 阅读
  5. Oracle【低版本实现UTC格式转换】

    2023-12-31 23:44:03       41 阅读
  6. 序列化机制以及应用场景

    2023-12-31 23:44:03       39 阅读
  7. 微服务(5)

    2023-12-31 23:44:03       38 阅读