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

使用UDP套接字搭建


文章目录

  • 使用UDP套接字搭建
  • 前言
  • 一、基本结构
  • 二、使用步骤
    • 1.服务器端
    • 2.客户端
  • 三、效果展示
  • 总结


前言

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

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

一、基本结构

需要新建两个py文件,一个用来运行服务器端,一个用来运行客户端。进行测试时,需要保证服务器端和客户端都在运行。


二、使用步骤

1.服务器端

代码如下:

import sockets = 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':breakexcept KeyboardInterrupt:breakprint('[+] 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 socketc = 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:breakc.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,则客户端将停止运行并关闭连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/588081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习部分相关概念

数据集(Data Set)即数据的集合,每一条单独的数据被称为样本(Sample)。 对于每个样本,它通常具有一些属性(Attribute)或者特征(Feature), 特征所具体取得值被称为特征值(Feature Value)。 西瓜数据集 色泽根蒂纹理青绿稍蜷模糊乌黑蜷缩清晰 …

Python编程-实现对自定义类对象排序

Python编程-实现对自定义类对象排序 具有不同标识的类的实例比较结果通常为不相等,除非类定义了 __eq__() 方法。 一个类的实例不能与相同类的其他实例或其他类型的对象进行排序,除非定义该类定义了足够多的方法,包括 __lt__(), __le__(), __…

学Python的正确顺序千万别弄反了,到时候后悔就来不及了

学Python的正确顺序:从基础到高级,步步为营 在当今数字化时代,Python已成为最受欢迎的编程语言之一。它不仅广泛应用于数据分析、人工智能和Web开发等领域,还为初学者提供了一个友好且功能强大的平台。然而,学习Python…

matalb实践(十二):减肥

1.题目 2.解答 2.1模型假设 1.体重增加正比于吸收的热量,平均每8000kcal增加体重1kg 2.身体正常代谢引起的体重减少正比于体重,每周每千克体重消耗热量一般在200kcal至320kcal之间,且因人而异,这相当于体重70kg的人每天消耗2000k…

【Spark精讲】一文讲透Spark RDD

MapReduce的缺陷 MR虽然在编程接口的种类和丰富程度上已经比较完善了,但这些系统普遍都缺乏操作分布式内存的接口抽象,导致很多应用在性能上非常低效 。 这些应用的共同特点是需要在多个并行操 作之间重用工作数据集 ,典型的场景就是机器学习…

【强化学习】SARAS代码实现

前言 SARAS,假设环境状态和动作状态都是离散的。利用动作价值矩阵来进行行为的预测。其主要就是利用时序差分的思想,对动作价值矩阵进行更新。 代码实现 import gymnasium as gym import numpy as npclass sarsa():def __init__(self, states_n, acti…

Apollo自动驾驶:改变交通运输的游戏规则

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 ChatGPT体验地址 文章目录 前言1. Apollo缓存层2. 本地状态管理库3. 离线同步和冲突解决4. 离线数据同步和离线优先策略结论 📲🔌 构建离线应用:Apollo…

ssm基于web 的个人时间管理系统+vue论文

基于web 的个人时间管理系统的设计与实现 摘要 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。传统的个人时间信息管理模式,采用人工登记的方式保存相关数据,这种以人…

【数据结构】排序之交换排序(冒泡 | 快排)

交换目录 1. 前言2. 交换排序3. 冒泡排序3.1 分析3.2 代码实现 4. 快速排序4.1 hoare版本4.1.1 分析4.1.2 hoare版本代码 4.2 挖坑法4.2.1 分析4.2.2 挖坑法代码实现 4.3 前后指针版本4.3.1 分析4.3.2 前后指针版本代码实现 1. 前言 在之前的博客中介绍了插入排序,…

QT designer的ui文件转py文件之后,实现pycharm中运行以方便修改逻辑,即添加实时模板框架

为PyCharm中的实时模板,你需要遵循以下步骤: 打开PyCharm的设置: 选择 File > Settings(在macOS上是 PyCharm > Preferences)。 导航到实时模板: 在设置中找到 Editor > Live Templates。 添加新的模板组 (可选): 为了…

Linux基础知识学习2

tree命令的使用 可以看到dir2目录下的这些文件,要想显示dir2的具体结构,可用tree命令 mv命令 它可以实现两个功能 1.将文件移动到另一个目录中 2.对某一个文件进行重命名 1.将文件移动到另一个目录中 这里将dir1中的2.txt移动到他的子目录dir3中 执行…

解构赋值的使用

结构赋值(Destructuring Assignment)是一种方便的语法,允许你从数组或对象中提取数据并赋值给变量。以下是结构赋值的一些常见用法: 1. 对象解构赋值: 基本语法: let { key1, key2 } { key1: value1, k…

“C语言与人生:手把手教你玩转C语言数组,从此编程无难题“

各位少年,我是博主那一脸阳光,由我来给大家介绍C语言的数组的详解。 在C语言中,数组是一种极其重要的数据结构,它允许我们存储和管理相同类型的一系列相关数据。通过理解并熟练掌握数组的使用,开发者能够高效地处理大量…

超真实随身WiFi测评,你确定不看一下?随身WiFi靠谱吗? 看完这篇文章你就懂了?随身WiFi真实评测

用了一年多的格行随身wifi,屏幕都磨花了。直接看图,都是自己实测! 设备是去年买的,到现在也快1年了,一直有朋友蹲后续,现在把后续给大家!到底是大牌子,确定是不跑路的随身wifi&…

Vue独立组件开发-递归组件

文章目录 一、前言二、实现三、总结四、最后 一、前言 递归组件就是指组件在模板中调用自己。 二、实现 开启递归组件的必要条件&#xff0c;就是在组件中设置一个 name 选项。 <template><div><my-component></my-component></div> </te…

JavaScript 中 Set 和 Map 的区别

JavaScript 中的 Set 和 Map 都是用来存储数据的数据结构&#xff0c;它们之间的区别如下&#xff1a; Set 是一组唯一值的集合&#xff0c;而 Map 是一组键值对的集合。Set 中的值是唯一的&#xff0c;不允许重复&#xff1b;Map 中的键是唯一的&#xff0c;值可以重复。Set …

提取 PE 文件的各种信息

前段时间项目需要实现对 Windows PE 文件版本信息的提取&#xff0c;如文件说明、文件版本、产品名称、版权、原始文件名等信息。获取这些信息在 Windows 下当然有一系列的 API 函数供调用&#xff0c;简单方便。 我们先看一下PE文件结构&#xff0c;PE文件由DOS首部&#xff0…

AES - 在tiny-AES-c基础上封装了2个应用函数(加密/解密)

文章目录 AES - 在tiny-AES-c基础上封装了2个应用函数(加密/解密)概述增加2个封装函数的AES库aes.haes.c在官方测试程序上改的测试程序(用来测试这2个封装函数)END AES - 在tiny-AES-c基础上封装了2个应用函数(加密/解密) 概述 在github山有个星数很高的AES的C库 tiny-AES-c …

LOJ #6277 数列分块1题解 2023年最后一篇题解

Part #0 . 前言 \text{Part \#0 . 前言} Part #0 . 前言 分块是一种优雅的暴力。 Part #1 . 数列分块入门1 \text{Part \#1 . 数列分块入门1} Part #1 . 数列分块入门1 传送门 这题是一个基础的分块&#xff0c;块外的暴力&#xff0c;块内做标记&#xff0c;块长 n \sqrt{…

2023-12-21 LeetCode每日一题(美丽塔 II)

2023-12-21每日一题 一、题目编号 2866. 美丽塔 II二、题目链接 点击跳转到题目位置 三、题目描述 给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。 你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i &#xff0c;高度为 heights[i] 。 如果以下条件满足&a…