python中的socket使用

目录

一. socket 基础

二. 创建一个 Socket

三. 服务器端

TCP 服务器示例:

四.客户端

TCP 客户端示例:

五. UDP 服务器和客户端

5.1 UDP 服务器示例:

5.2 UDP 客户端示例:

5.3 UDP非阻塞监听

5.3.1 服务端代码:

5.3.2 客户端代码:

5.3.3 注意事项

六. 处理异常

七.处理多个请求 

7.1 UDP 服务器端

7.2 UDP 客户端示例

7.3 说明


        Python 的 socket 模块提供了网络编程的基础,可以使用它创建服务器和客户端应用程序。以下是对 socket 编程的详细介绍,包括常见操作和示例。

一. socket 基础

        socket 是网络通信的端点。Python 的 socket 模块提供了创建、连接和操作 socket 的方法。

二. 创建一个 Socket

        可以使用 socket.socket() 函数创建一个 socket 对象。通常指定两个参数:地址族和套接字类型。

  • 地址族

    • AF_INET:IPv4
    • AF_INET6:IPv6
    • AF_UNIX:本地通信
  • 套接字类型

    • SOCK_STREAM:TCP(面向连接的套接字)
    • SOCK_DGRAM:UDP(数据报套接字)
import socket# 创建一个TCP/IP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

三. 服务器端

服务器通常执行以下步骤:

  1. 绑定(bind):将套接字绑定到一个特定的地址和端口,使其可以监听来自客户端的连接请求。
  2. 监听(listen):使套接字进入监听模式,准备接受传入的连接请求。
  3. 接受(accept):一旦有客户端尝试连接,服务器接受连接请求并建立通信。
  4. 接收和发送数据(recv 和 send):服务器与客户端之间进行数据交换。
  5. 关闭连接(close):当通信结束时,关闭套接字以释放资源。

TCP 服务器示例:

import socket# 创建一个TCP/IP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定套接字到地址和端口
server_address = ('localhost', 65432)
server_socket.bind(server_address)# 监听连接请求
server_socket.listen(1)print("等待连接...")
# 接受连接请求
connection, client_address = server_socket.accept()
print(f"连接来自 {client_address}")try:while True:data = connection.recv(1024)if data:print(f"接收到的数据: {data.decode()}")connection.sendall(data)else:break
finally:connection.close()server_socket.close()

四.客户端

客户端通常执行以下步骤:

  1. 创建套接字(socket):与服务器端类似,首先创建一个套接字对象。
  2. 连接(connect):使用服务器的地址和端口连接到服务器。
  3. 接收和发送数据(recv 和 send):与服务器进行数据通信。
  4. 关闭连接(close):通信结束后,关闭套接字。

TCP 客户端示例:

import socket# 创建一个TCP/IP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接到服务器
server_address = ('localhost', 65432)
client_socket.connect(server_address)try:message = "Hello, Server!"print(f"发送消息: {message}")client_socket.sendall(message.encode())data = client_socket.recv(1024)print(f"接收到的数据: {data.decode()}")
finally:client_socket.close()

五. UDP 服务器和客户端

        UDP 是无连接的,因此不需要监听和接受连接。

5.1 UDP 服务器示例:

import socketserver_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('localhost', 65432)
server_socket.bind(server_address)print("等待接收数据...")
while True:data, address = server_socket.recvfrom(1024)print(f"接收到的数据来自 {address}: {data.decode()}")server_socket.sendto(data, address)

5.2 UDP 客户端示例:

import socketclient_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('localhost', 65432)message = "Hello, Server!"
client_socket.sendto(message.encode(), server_address)data, server = client_socket.recvfrom(1024)
print(f"接收到的数据: {data.decode()}")client_socket.close()

5.3 UDP非阻塞监听

        在 UDP 套接字编程中,非阻塞模式允许套接字在没有数据到达时不阻塞,继续执行后续代码。可以通过设置套接字的非阻塞模式实现这一点。以下是如何在 Python 中实现 UDP 非阻塞监听的示例:

5.3.1 服务端代码:

import socket
import time# 创建一个UDP/IP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定套接字到地址和端口
server_address = ('localhost', 65432)
server_socket.bind(server_address)# 设置为非阻塞模式
server_socket.setblocking(False)print("等待接收数据...")while True:try:data, address = server_socket.recvfrom(1024)print(f"接收到的数据来自 {address}: {data.decode()}")server_socket.sendto(data, address)except BlockingIOError:# 如果没有数据到达,会抛出BlockingIOError异常,可以在这里进行其他处理print("没有数据到达,继续执行其他任务...")time.sleep(1)  # 模拟其他任务的执行

5.3.2 客户端代码:

import socket# 创建一个UDP/IP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)server_address = ('localhost', 65432)
message = "Hello, Server!"try:print(f"发送消息: {message}")sent = client_socket.sendto(message.encode(), server_address)# 设置为非阻塞模式(仅用于演示,通常客户端不需要非阻塞模式)client_socket.setblocking(False)while True:try:data, server = client_socket.recvfrom(1024)print(f"接收到的数据: {data.decode()}")breakexcept BlockingIOError:# 如果没有数据到达,会抛出BlockingIOError异常,可以在这里进行其他处理print("等待服务器响应...")
finally:client_socket.close()

5.3.3 注意事项

  1. 异常处理:在非阻塞模式下,当没有数据可读时,recvfrom 会抛出 BlockingIOError 异常。需要捕获并处理这个异常。
  2. 资源利用:在非阻塞模式下,需要确保在没有数据到达时不会无限循环占用 CPU 资源。可以使用 time.sleep() 函数或其他方式让出 CPU 时间片。
  3. 其他处理:在没有数据到达时,可以在 except 块中处理其他任务,如日志记录、状态更新等。

        通过这种方式,可以实现 UDP 套接字的非阻塞监听,确保程序在等待数据时不会阻塞,能够同时处理其他任务。

六. 处理异常

        在网络编程中,处理异常是很重要的。可以使用 tryexcept 块来捕获和处理可能发生的异常。

import sockettry:sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.connect(('localhost', 65432))sock.sendall(b'Hello, World!')data = sock.recv(1024)print(f"接收到的数据: {data.decode()}")
except socket.error as e:print(f"Socket error: {e}")
finally:sock.close()

七.处理多个请求 

        在网络编程中,如果需要同时等待多个数据连接,可以使用 select 模块。select 模块提供了一种机制,可以监控多个文件描述符(包括套接字),等待其中任何一个变为可读、可写或发生异常。这样可以有效地管理多个客户端连接而不需要为每个连接创建一个独立的线程。以下是使用 select 模块在一个服务器上同时等待多个数据连接的示例。

  1. 创建并绑定一个服务器套接字。
  2. 将服务器套接字设置为非阻塞模式。
  3. 使用 select.select 方法监控多个套接字的状态。

7.1 UDP 服务器端

import socket
import select# 创建并绑定一个UDP/IP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('localhost', 65432))
server_socket.setblocking(False)# 初始化读、写、错误列表
inputs = [server_socket]
outputs = []
message_queues = {}print("服务器启动,等待连接...")while inputs:readable, writable, exceptional = select.select(inputs, outputs, inputs)for s in readable:if s is server_socket:# 处理客户端消息data, client_address = s.recvfrom(1024)if data:print(f"接收到的数据来自 {client_address}: {data.decode()}")if client_address not in message_queues:message_queues[client_address] = []message_queues[client_address].append(data)if s not in outputs:outputs.append(s)for s in writable:for client_address in message_queues:if message_queues[client_address]:next_msg = message_queues[client_address].pop(0)s.sendto(next_msg, client_address)if not message_queues[client_address]:del message_queues[client_address]outputs.remove(s)for s in exceptional:print(f"异常情况发生在 {s.getpeername()}")inputs.remove(s)if s in outputs:outputs.remove(s)s.close()

7.2 UDP 客户端示例

import socket# 创建一个UDP/IP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('localhost', 65432)try:message = "Hello, Server!"print(f"发送消息: {message}")sent = client_socket.sendto(message.encode(), server_address)while True:data, server = client_socket.recvfrom(1024)print(f"接收到的数据: {data.decode()}")break
finally:client_socket.close()

7.3 说明

服务器端

  1. 创建一个 UDP 套接字并绑定到特定地址和端口。
  2. 将套接字设置为非阻塞模式。
  3. 使用 select.select 监听套接字的可读状态。
  4. 接收到数据后,将其存储在消息队列中。
  5. 使用 select.select 监听套接字的可写状态,并将消息发送回客户端。

客户端

  1. 创建一个 UDP 套接字并发送数据到服务器。
  2. 接收服务器的响应数据。

        这种方法可以处理多个客户端请求,而无需为每个客户端创建单独的线程或进程。通过使用 select 模块,可以有效地管理和处理多个套接字的状态变化。

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

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

相关文章

题目 2721: 蓝桥杯2022年第十三届决赛真题-背包与魔法

题目 2721: 蓝桥杯2022年第十三届决赛真题-背包与魔法 原题链接:完成情况:解题思路:Problem ExplanationCode ExplanationSummary 参考代码:_题目2721_蓝桥杯2022年第十三届决赛真题_背包与魔法 错误经验吸取 原题链接&#xff1…

产品设计职责和量化衡量尺度

产品设计职责和量化衡量尺度 1. 源由2. 职责(Responsibilities)3. 量化矩阵(Quantify Work and Metrics)3. 具体方法(Specific Measures)4. 交付依据(Delivery Product Guidelines)5. 备忘(Memo)6. 补充 - Product Design Responsibilities and Quantitative Metrics6.1 Respon…

Hexo结合多个主题扩展为Gallery画廊并实现文章加密

文章目录 1. 初始化2. 安装加密3. 配置文件4. 创建Token5. 新建公开仓库6. 工作流7. 实现效果1. 加密2. 画廊B主题 可能参考的文章: 如何优雅的使用Github Action服务来将Hexo部署到Github Pages - Hexo 当前PC环境中有Node和Git。版本可以参考Hexo文档。 文章中…

ubuntu的不同python版本的pip安装及管理

ubuntu的不同python版本的pip安装及管理_ubuntu 安装两个pip-CSDN博客https://blog.csdn.net/qq_32277533/article/details/106770850

LRUCache

LRUCache是Android中实现内存缓存相关的组件类,当缓存满时其使用最近最少使用策略来淘汰相关的元素,以控制缓存大小。本文主要基于LRUCache相关源码分析LRUCache的创建、缓存的添加、获取、删除流程。 LRUCache创建 LRUCache的创建可以直接看其构造函数…

SpringBoot的Mybatis-plus实战之扩展功能

文章目录 一、枚举处理器第一步、定义枚举第二步、配置文件中设置 在学习mybatisPlus时会用到扩展功能,极大解放生产力,记录下来,方便备查。 一、枚举处理器 第一步、定义枚举 新建枚举类UserStatusEnum,其主要内容如下所示。 E…

JDBC: 2.初级教程

搭建 依赖 <dependencies><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.27</version></dependency></dependencies> jdbc.properties u…

第10章 启动过程组 (识别干系人)

第10章 启动过程组 10.2识别干系人&#xff0c;在第三版教材第361~362页&#xff1b; 文字图片音频方式 视频13 第一个知识点&#xff1a;主要工具与技术 1、数据收集 问卷调查 包括一对一调查、焦点小组讨论&#xff0c;或其他大规模信息收集技术 头脑风暴 头脑风暴&#xff…

本地服务怎么发布成rpc服务

目录 1.引入 2.user.proto 3.userservice.cc 1.引入 example文件夹作为我们框架项目的使用实例&#xff0c;在example文件夹下创建callee和caller两个文件夹 callee是RPC服务的提供者。在callee创建一个文件&#xff1a;userservice.cc 我们有没有这样一个框架&#xff0c;把…

代码随想录算法训练营Day49|300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组

最长递增子序列 300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; dp[i]为到当前位置i为止的最长递增子序列的长度&#xff0c;所以dp[nums.size()-1]并不一定是整个数组的最长递增子序列的长度。这里需要注意&#xff0c;但这个dp[i]怎么来的&#xff0c;我确实…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP4162(SPI接口)的数字电位器Proteus仿真

一、仿真原理图: 二、仿真效果: 三、STM32CubeMX配置: 1)、SPI配置: 2)、时钟配置: 四、软件部分: 1)、主函数: /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : mai…

牛皮的程序猿后端返回值怎么定义

在后端接口封装中&#xff0c;我们一般都会对返回的数据做一个封装&#xff0c;以防止系统出现不可预期的数据结构和类型。比如这样&#xff1a; 结构体 1 {"success": true,"code": 200,"message": "成功","data": {&quo…

MinIO下载和安装(Windows)

1、MinIO下载和安装 | 用于创建高性能对象存储的代码和下载内容 2、在本地硬盘中并新建一个minio文件夹 里面再创建bin文件夹和data文件夹 bin 用于存放下载的minio.exe data 用于存放数据 logs 用于存放日志 3、 编写启动脚本start.bat echo off echo [信息] 运行MinIO文服务…

群智优化:探索BP神经网络的最优配置

群智优化&#xff1a;探索BP神经网络的最优配置 一、数据集介绍 鸢尾花数据集最初由Edgar Anderson测量得到&#xff0c;而后在著名的统计学家和生物学家R.A Fisher于1936年发表的文章中被引入到统计和机器学习领域数据集特征&#xff1a; 鸢尾花数据集包含了150个样本&#…

赶紧收藏!2024 年最常见的操作系统面试题(三)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见的操作系统面试题&#xff08;二&#xff09;-CSDN博客 五、操作系统中的文件系统是如何工作的&#xff1f; 操作系统中的文件系统是一套用于存储、组织和检索文件的系统。它提供了一种结构化的方式来管理存储设备上…

工业软件的分类与选择策略:针对中小企业的实际应用考量

工业软件是现代工业体系的“大脑”&#xff0c;已经渗透到几乎所有工业领域的核心环节&#xff0c;是现代产业之“魂”&#xff0c;是制造强国之重器。工业软件通过优化生产流程、实时监控设备状态、实现自动化控制等功能&#xff0c;可以帮助企业显著提升生产效率和质量&#…

鸿蒙开发系统基础能力:【@ohos.hiTraceMeter (性能打点)】

性能打点 本模块提供了追踪进程轨迹&#xff0c;度量程序执行性能的打点能力。本模块打点的数据供hiTraceMeter工具分析使用。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 impor…

MySQL配置数据库允许大写字母

MySQL 5.7 默认是支持大写字母的&#xff0c;MySQL 8.0则默认不支持&#xff0c;数据库名称默认都是小写&#xff0c;即使输入了大写也会变成小写&#xff0c;如果你希望数据库名称允许大写字母&#xff0c;你可以修改 MySQL 的配置文件实现此操作&#xff1a; 操作步骤 在My…

【宠粉赠书】SQLServer2022:从入门到精通

为了回馈粉丝们的厚爱&#xff0c;今天小智给大家送上一套数据库学习的必备书籍——《SQL Server 2022从入门到精通》。下面我会详细给大家介绍这套图书&#xff0c;文末留有领取方式。 图书介绍 《SQL Server 2022从入门到精通》系统全面地介绍SQL Server 2022数据库应用与开…

Dolphinscheduler Docker部署全攻略

作者| 陈逸飞 Docker部署的目的是在容器中快速启动部署Apache Dolphinscheduler服务。 先决条件 docker-composedocker 使用容器单机部署Dolphinscheduler 请下载源码包apache-dolphinscheduler--src.tar.gz&#xff0c;下载地址&#xff1a;下载 首先确定服务启动所需的…