Python 的 socket 模块套接字编程(简单入门级别)

Python 的 socket 模块提供了对套接字编程的支持,允许你在网络上进行数据传输。套接字是一个抽象的概念,它允许程序在网络中的不同节点之间进行通信。

下面是 socket 模块中一些常用的函数和类:

1. 创建套接字:

  • socket.socket(family, type[, proto]) 创建一个新的套接字。family 参数表示地址族,可以是 socket.AF_INET(IPv4)或 socket.AF_INET6(IPv6)。type 参数表示套接字的类型,可以是 socket.SOCK_STREAM(TCP)或 socket.SOCK_DGRAM(UDP)等。proto 参数通常省略,表示默认协议。

2. 服务器端:

  • socket.bind(address) 将套接字绑定到指定的地址和端口。address 是一个元组,包含主机和端口号。

  • socket.listen(backlog) 开始监听传入的连接请求。backlog 参数指定在拒绝新连接之前,操作系统可以挂起的最大连接数。

  • socket.accept() 接受连接并返回一个新的套接字和连接的地址。通常在服务器中使用,返回的套接字用于与客户端进行通信。

3. 客户端:

  • socket.connect(address) 连接到指定的服务器地址。address 是一个元组,包含服务器的主机名和端口号。

4. 数据传输:

  • socket.send(data) 发送数据到连接的套接字。data 是要发送的数据。

  • socket.recv(bufsize) 从连接的套接字接收数据。bufsize 指定要接收的最大字节数。

5. 通用:

  • socket.close() 关闭套接字连接。

--以下是一个简单的服务器和客户端的例子,演示了基本的套接字通信: 

 服务器端:

import socketserver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8888))
server_socket.listen(1)print("Waiting for connection...")
client_socket, client_address = server_socket.accept()
print(f"Connected to {client_address}")data = client_socket.recv(1024)
print(f"Received data: {data.decode()}")client_socket.close()
server_socket.close()

 客户端:

import socketclient_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 8888))message = "Hello, server!"
client_socket.send(message.encode())client_socket.close()

6.多线程/多进程:

在网络编程中,通常会涉及到同时处理多个连接的情况。为了提高性能和并发处理能力,可以使用多线程或多进程。

使用 threading 模块进行多线程处理的简单示例:

import socket
import threadingdef handle_client(client_socket):# 处理客户端连接的逻辑data = client_socket.recv(1024)# 其他操作client_socket.close()server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8888))
server_socket.listen(5)while True:client_socket, addr = server_socket.accept()client_handler = threading.Thread(target=handle_client, args=(client_socket,))client_handler.start()

7. 异常处理:

网络通信可能会面临各种异常情况,例如连接中断、超时、数据格式错误等。在代码中需要适当处理这些异常,以确保程序的稳定性。使用 tryexcept 块可以捕获并处理这些异常。

import sockettry:client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client_socket.connect(('example.com', 80))# 其他网络操作
except socket.error as e:print(f"Socket error: {e}")
finally:client_socket.close()

8. 异步编程:

使用异步编程模型可以提高网络应用程序的性能和并发能力。Python 中的 asyncio 模块提供了异步编程的支持。异步套接字编程涉及到使用 asyncio 中的事件循环、协程等概念,对于大规模并发的网络应用可能是更合适的选择。

以下是一个简单的示例,演示了使用 asyncio 和异步套接字编程的基本用法: 

在上面的例子中,handle_client 是一个协程,用于处理客户端连接。asyncio.start_server 用于创建一个异步服务器。await server.serve_forever() 使服务器一直运行,处理来自客户端的连接。

异步编程的优势在于可以更高效地处理大量的并发连接,而不会造成线程或进程的开销。每个连接可以在等待 IO 操作时释放控制权,允许其他连接执行,从而提高系统的并发处理能力。

import asyncioasync def handle_client(reader, writer):data = await reader.read(100)message = data.decode()addr = writer.get_extra_info('peername')print(f"Received {message} from {addr}")print("Send: %r" % message)writer.write(data)await writer.drain()print("Closing the connection")writer.close()async def main():server = await asyncio.start_server(handle_client, '127.0.0.1', 8888)addr = server.sockets[0].getsockname()print(f'Serving on {addr}')async with server:await server.serve_forever()asyncio.run(main())

异步编程是一种并发编程的范例,旨在通过非阻塞的方式处理多个任务,以提高程序的效率和性能。在异步编程中,程序可以在等待某些 I/O 操作完成的同时执行其他任务,而不必等待阻塞的操作完成。
在 Python 中,asyncio 是标准库中用于支持异步编程的模块。异步编程的关键概念包括事件循环、协程、任务等。
1. 事件循环:
事件循环是异步编程的核心。它负责调度和协调异步任务的执行。在 asyncio 中,事件循环通过 asyncio.run() 启动:
2. 协程:
协程是异步编程中的一种特殊函数,使用 async def 定义。它可以在执行过程中被挂起,让出控制权给事件循环,允许其他协程执行。协程使用 await 关键字来等待异步操作完成。
3. 任务:
任务是协程的一种运行形式,它可以由事件循环进行调度和执行。使用 asyncio.create_task() 来创建一个任务:
4. 异步IO操作:
异步编程主要用于处理 I/O 操作,如文件读写、网络通信等。异步IO操作可以使用 asyncio 提供的异步函数,例如 asyncio.open() 用于异步文件操作,asyncio.start_server() 用于异步网络服务的创建等。

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

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

相关文章

pycharm 创建的django目录和命令行创建的django再使用pycharm打开的目录对比截图 及相关

pytcharm创建django的项目 命令行创建的django 命令行创建项目时 不带路径时 (.venv) D:\gbCode>django-admin startproject gbCode 命令行创建项目时 带路径时 -- 所以如果有目录就指定路径好 (.venv) D:\gbCode>django-admin startproject gbCode d:\gbCode\

洛谷P1219 [USACO1.5] 八皇后【n皇后问题】【深搜+回溯 经典题】【附O(1)方法】

P1219 [USACO1.5] 八皇后 Checker Challenge 前言题目题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题目分析注意事项 代码深搜回溯打表 后话额外测试用例样例输入 #2样例输出 #2 王婆卖瓜 题目来源 前言 也是说到做到,来做搜索的题(虽…

微机原理_2

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) 下列数中最大的数为() A. 10010101B B. (126)8 C. 96H D. 100 CPU 执行 OUT 60H,…

Android 9.0 隐藏设置显示中自动调节亮度

Android 9.0 隐藏设置显示中自动调节亮度 最近收到邮件需求提到想要隐藏设置显示中的自动调节亮度&#xff0c;具体修改参照如下&#xff1a; /vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/display_settings.xml - <Preference<!--Preferencea…

西门子(Siemens)仿真PLC启动报错处理

目录 一、背景&#xff1a; 二、卸载软件 三、安装软件 三、启动软件 四、下载PORTAL项目 五、测试 一、背景&#xff1a; 在启动S7-PLCSIM Advanced V3.0仿真PLC时报错&#xff0c;报错信息为&#xff1a;>>Siemens PLCSIM Virtual Switch<<is misconfigu…

Ubuntu 23.10 服务器版本 ifconfig 查不到网卡 ip(已解决)

文章目录 1、问题描述2、 解决方案 1、问题描述 服务器&#xff1a;ubuntu 23.10 经常会遇到虚拟机添加仅主机网卡后&#xff0c;通过 ifconfig 无法获取其网卡 ip 2、 解决方案 修改网卡配置文件&#xff1a; # 进入网卡配置文件目录 cd /etc/netplan # 备份原始文件 cp …

ArgoWorkflow教程(一)---DevOps 另一选择?云原生 CICD: ArgoWorkflow 初体验

来自&#xff1a;探索云原生 https://www.lixueduan.com 原文&#xff1a;https://www.lixueduan.com/posts/devops/argo-workflow/01-deploy-argo-workflows/ 本文主要记录了如何在 k8s 上快速部署云原生的工作流引擎 ArgoWorkflow。 ArgoWorkflow 是什么 Argo Workflows 是…

网络安全如何自学?

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

使用 Vue3 + Pinia + Ant Design Vue3 搭建后台管理系统

Vue3 & Ant Design Vue3基础 nodejs版本要求&#xff1a;node-v18.16.0-x64 nodejs基础配置 npm -v node -vnpm config set prefix "D:\software\nodejs\node_global" npm config set cache "D:\software\nodejs\node_cache"npm config get registry …

2023亚太赛数学建模A题:采果机器人的图像识别技术思路模型代码

亚太A题&#xff1a;采果机器人的图像识别技术 A题完整思路获取 &#xff1a;获取见文末名片&#xff0c;第一时间更新 中国是世界上最大的苹果生产国&#xff0c;年产量约为3500万吨。与此同时&#xff0c;中国也是世 界上最大的苹果出口国&#xff0c;全球每两个苹果中就有…

Android设计模式--装饰模式

千淘万漉虽辛苦&#xff0c;吹尽黄沙始到金 一&#xff0c;定义 动态地给一个对象添加一些额外的职责。就增加功能来说&#xff0c;装饰模式相比生成子类更为灵活。 装饰模式也叫包装模式&#xff0c;结构型设计模式之一&#xff0c;其使用一种对客户端透明的方式来动态地扩展…

QT 中的元对象系统

作为一名十几年的 C 程序员&#xff0c;最近一段时间使用 QT 开发程序&#xff0c;发现 QT 中还是有许多值得深入理解的技术。QT 不仅仅是一个应用程序开发框架&#xff0c;还有一些对标准 C 的扩充。本文和大家一起探讨 QT 中的元对象系统。 在分析 QT 中的元对象系统之前&…

<JavaEE> 什么是线程(Thread)?进程和线程有什么区别?

目录 一、线程&#xff08;Thread&#xff09;的概念 二、线程存在的意义 2.1 并发编程 2.2 比进程更“轻量” 三、使用线程时应该注意 四、进程和线程的区别 五、Java中的线程和操作系统中的线程是不同的概念 六、多线程编程 一、线程&#xff08;Thread&#xff09;的…

蓝桥杯官网练习题(奇怪的数列)

题目描述 从 X 星截获一份电码&#xff0c;是一些数字&#xff0c;如下&#xff1a; 13 1113 3113132113 1113122113 ⋯ YY 博士经彻夜研究&#xff0c;发现了规律&#xff1a; 第一行的数字随便是什么&#xff0c;以后每一行都是对上一行"读出来" 比如第 2…

图神经网络的数学原理总结

图深度学习(Graph Deep Learning) 多年来一直在加速发展。许多现实生活问题使GDL成为万能工具&#xff1a;在社交媒体、药物发现、芯片植入、预测、生物信息学等方面都显示出了很大的前景。 本文将流行的图神经网络及其数学细微差别的进行详细的梳理和解释&#xff0c;图深度学…

Linux中flask项目开启https访问

1.下载阿里云免费证书 2.项目添加https配置 3.服务器开启https访问 3.1 重新安装OpenSSL 3.2.重新安装Python 上一次已经讲过Linux安装部署Python: Linux安装Python3.10与部署flask项目实战详细记录,今天记录一下Python项目如何支持https访问…

《计算机中的程序》(灵魂六问)

目录 1、程序是什么&#xff1f; 2、程序是由什么组成的&#xff1f; 3、什么是机器语言&#xff1f; 4、正在运行的程序存储在什么位置&#xff1f; 5、什么是内存地址&#xff1f; 6、计算机的构成元件中&#xff0c;负责程序的解释和运行是哪个&#xff1f; 1、程序是什…

性能相关的闪存特性

一、多Plane操作 上章提到若干个Plane组成Die或者叫LUN,即一个Die上有多个Plane 每次进行写操作时&#xff0c;控制器先将数据写入页缓存中&#xff0c;等同一个Die上另一个Plane也写数据的时候&#xff0c;再同时写入&#xff0c;原来单独操作一个Plane的时间变成了可以同时做…

Springmvc实现增删改差

一、包结构 二、各层代码 (1)数据User public class User {private Integer id;private String userName;private String note;public User() {super();}public User(Integer i, String userName, String note) {super();this.id i;this.userName userName;this.note note;…

Qt实现自定义IP地址输入控件(百分百还原Windows 10网络地址输入框)

在开发网络相关的程序时,我们经常需要输入IP地址,例如源地址和目标地址。Qt提供了一些基础的控件,如QLineEdit,但是它们并不能满足我们对IP地址输入的要求,例如限制输入的格式、自动跳转到下一个输入框、处理回车和退格键等。因此,我们需要自己编写一个自定义的IP地址输入…