[Python学习篇] Python Socket网络编程

Python中的socket编程是通过内置的socket模块实现的,可以方便地创建网络应用程序,包括客户端和服务器。

服务端

1. 创建套接字

使用socket.socket()函数创建一个TCP套接字。套接字可以是流式(TCP)或数据报式(UDP)

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  • socket.AF_INET:表示使用IPv4地址。
  • socket.SOCK_STREAM:表示套接字类型为流式套接字,即TCP。

2. 绑定地址和端口

使用bind()方法将套接字绑定到特定的IP地址和端口号上,以便客户端能够连接到该地址和端口。IP可以不指定表示本机地址。

server_address = ('localhost', 8080) 

server_socket.bind(server_address)

3. 监听连接请求

使用listen()方法开始监听客户端的连接请求。参数backlog指定等待连接的最大数量。当服务器忙于处理当前连接而不能立即处理新的连接请求时,这些新的连接请求将会被放入一个等待队列中,直到服务器有能力处理它们。backlog参数定义了这个等待队列的最大长度。

server_socket.listen(5)          # 最多允许5个等待连接的请求

4. 接受客户端连接

使用accept()方法接受客户端的连接。该方法会阻塞程序,直到有客户端连接进来。一旦有连接,accept()方法返回一个新的套接字(client_socket)和客户端的地址信息(client_address)。

client_socket, client_address = server_socket.accept()

  • client_socket:是与客户端通信的新套接字。
  • client_address:是客户端的地址信息,通常是一个元组(IP地址, 端口号)。

5. 与客户端通信

使用返回的client_socket对象与客户端进行数据交换。可以使用recv()方法接收客户端发送的数据,recv方法会阻塞直到接收到数据,并使用sendall()方法发送响应给客户端。

data = client_socket.recv(1024)  # 接收数据,指定缓冲区大小为1024字节
client_socket.sendall(data)  # 发送响应数据给客户端

6. 关闭连接

当通信结束后,使用close()方法关闭客户端套接字和服务器套接字,释放资源。

server_socket.close()  # 关闭服务器套接字

TCP socket服务器代码

示例:

import socket
import threading# 服务器地址和端口
SERVER_HOST = 'localhost'
SERVER_PORT = 12345def handle_client(client_socket):try:# 接收客户端的数据data = client_socket.recv(1024)print(f'收到客户端消息: {data.decode()}')  # decode:把字节数据转换成字符串数据# 发送响应给客户端message = 'Hello 我是服务端!'client_socket.sendall(message.encode())  # encode:把字符串数据转换成字节数据except Exception as e:print(f'处理客户端连接时出错: {e}')finally:# 关闭客户端连接client_socket.close()def start_server():# 创建TCP套接字server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置端口复用选项server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)try:# 绑定服务器地址和端口server_socket.bind((SERVER_HOST, SERVER_PORT))# 开始监听连接server_socket.listen(128)print(f'服务器启动,监听 {SERVER_HOST}:{SERVER_PORT}')while True:# 等待客户端连接client_socket, client_address = server_socket.accept()print(f'接受来自 {client_address} 的连接')# 使用线程处理客户端请求client_thread = threading.Thread(target=handle_client, args=(client_socket,))client_thread.start()except Exception as e:print(f'服务器启动失败: {e}')finally:# 关闭服务器套接字server_socket.close()if __name__ == "__main__":start_server()

客户端

1. 创建套接字

使用socket.socket()函数创建一个TCP套接字。

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  • socket.AF_INET:表示使用IPv4地址。
  • socket.SOCK_STREAM:表示套接字类型为流式套接字,即TCP。

2. 连接到服务器

使用connect()方法连接到服务器的地址和端口。

server_address = ('localhost', 12345)  # 服务器地址和端口
client_socket.connect(server_address)

3. 发送数据

使用sendall()方法将数据发送到服务器。该方法确保数据被完整发送。

message = '我是客户端数据!'
client_socket.sendall(message.encode())

4. 接收数据

使用recv()方法从服务器接收数据,该方法会阻塞直到收到数据。参数指定接收缓冲区的大小。

data = client_socket.recv(1024)
print(f'收到服务器消息: {data.decode()}')

5. 关闭连接

使用close()方法关闭套接字,释放资源。

client_socket.close()

TCP socket客户端代码

示例:

# client.py
import socket# 服务器地址和端口
SERVER_HOST = 'localhost'
SERVER_PORT = 12345def start_client():try:# 1. 创建TCP套接字client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2. 连接服务器client_socket.connect((SERVER_HOST, SERVER_PORT))print(f'已连接到服务器 {SERVER_HOST}:{SERVER_PORT}')# 3. 发送数据给服务器message = 'Hello 我是客户端!'client_socket.sendall(message.encode())  # encode:把字符串数据转换成字节数据# 4. 接收服务器的响应data = client_socket.recv(1024)print(f'收到服务器消息: {data.decode()}')  # decode:把字节数据转换成字符串数据except Exception as e:print(f'客户端出错: {e}')finally:# 5. 关闭客户端套接字client_socket.close()if __name__ == "__main__":start_client()

客户端不断开,接收用户输入信息发送到服务端

示例:

服务端代码

# server.py
import socket
import threading# 服务器地址和端口
SERVER_HOST = 'localhost'
SERVER_PORT = 12345def handle_client(client_socket):try:while True:# 接收客户端的数据data = client_socket.recv(1024)if not data:breakprint(f'收到客户端消息: {data.decode()}')# 发送响应给客户端message = 'Echo: ' + data.decode()client_socket.sendall(message.encode())except Exception as e:print(f'处理客户端连接时出错: {e}')finally:# 关闭客户端连接client_socket.close()def start_server():# 创建TCP套接字server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:# 绑定服务器地址和端口server_socket.bind((SERVER_HOST, SERVER_PORT))# 开始监听连接,请求等待队列的最大长度设置为128server_socket.listen(128)print(f'服务器启动,监听 {SERVER_HOST}:{SERVER_PORT} ...')while True:# 等待客户端连接client_socket, client_address = server_socket.accept()print(f'接受来自 {client_address} 的连接')# 使用线程处理客户端请求client_thread = threading.Thread(target=handle_client, args=(client_socket,))client_thread.start()except Exception as e:print(f'服务器启动失败: {e}')finally:# 关闭服务器套接字server_socket.close()if __name__ == "__main__":start_server()

客户端代码

# client.py
import socket# 服务器地址和端口
SERVER_HOST = 'localhost'
SERVER_PORT = 12345def start_client():try:# 创建TCP套接字client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接服务器client_socket.connect((SERVER_HOST, SERVER_PORT))print(f'已连接到服务器 {SERVER_HOST}:{SERVER_PORT}')while True:# 从用户获取输入message = input('请输入发送给服务器的消息: ')# 发送数据到服务器client_socket.sendall(message.encode())# 接收服务器的响应data = client_socket.recv(1024)print(f'收到服务器消息: {data.decode()}')except Exception as e:print(f'客户端出错: {e}')finally:# 关闭客户端套接字client_socket.close()if __name__ == "__main__":start_client()

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

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

相关文章

HSP_15章 Python_模板设计模式和oop进阶总结

P136 模板设计模式 1. 设计模式简介 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式 设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和摸索 2. 模板设计模式 基本…

【面试八股总结】单例模式实现详解

一、基本概念 单例设计模式是⼀种确保⼀个类只有⼀个实例,并提供⼀个全局访问点来访问该实例的创建模式。 关键概念: 一个私有构造函数:确保只能单例类自己创建实例一个私有静态变量:确保只有一个实例,私有静态变量用…

4-4 词嵌入技术(word2vec)

4-4 词嵌入技术(word2vec) 词嵌入技术(word2vec)是自然语言处理(NLP)中的一种关键技术,通过将词语映射到低维向量空间中,使得计算机能够理解和处理语言中的语义信息。词嵌入不仅可以…

【性能测试】第一节.性能测试基础

文章目录 前言一、性能测试概述二、常见的性能测试指标 2.1 并发 2.2 响应时间 2.3 事务 2.4 点击率 2.5 吞吐量 2.6 资源利用率三、性能测试的分类 3.1 一般性能测试 3.2 负载测试 3.3 压力测试 3.4 稳定性测试总结 前言 一…

CAS详解

文章目录 CAS使用示例Unsafe类实现原理CAS问题 CAS CAS全称为Compare and Swap被译为比较并交换,是一种无锁算法。用于实现并发编程中的原子操作。CAS操作检查某个变量是否与预期的值相同,如果相同则将其更新为新值。CAS操作是原子的,这意味…

【错题集-编程题】栈和排序(栈 + 贪心)

牛客对于题目连接:栈和排序_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 每次尽可能的先让当前需要的最大值弹出去。 二、代码 // 修改后的代码 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方…

【2024_CUMCM】Matlab快速入门

目录 常识 disp and input 字符串合并 sum 提取矩阵指定位置的元素 指定行列 指定行or指定列(返回行/列向量) 指定某些行 指定全部元素,按列拼接 size repmat 矩阵的运算 基本运算 形状相同的矩阵运算 每个元素同时和常数相乘或相…

C++相关概念和易错语法(19)(继承规则、继承下的构造和析构、函数隐藏)

1.继承规则 继承的本质是复用,是结构上的继承而不是内容上的继承,近似于在子类中声明了父类的成员变量。 (1)写法:class student : public person 派生类(子类),继承方式&…

代码随想录算法训练营第二十八天|56. 合并区间、738.单调递增的数字

56. 合并区间 给出一个区间的集合&#xff0c;请合并所有重叠的区间。 class Solution { public:static bool cmp(const vector<int>& A, const vector<int>& B){if(A[0]!B[0]) return A[0]<B[0];return A[1]<B[1];}vector<vector<int>&g…

Python的基础语法——持续更新版

1、type查看数据类型 # 直接输出结果 print(type("Hello")) # 先用变量存储 string_type type("Hello") print(string_type) 2、 类型转化 任何类型可以转化为字符串&#xff0c;但字符串不可以随意转化&#xff0c;要求字符串类内容都是数字 # 类型…

泛二级泛目录多模板程序程序(泛目录和二级目录的区别)

泛解析站群_优化网站排名吸引百度蜘蛛必备程序主要功能&#xff1a; 1、网站支持无限生成页面不存在死链的风险每个也是不是网站栏目就是文章内容! 2、支持域名泛解析绑定&#xff0c;每个二级域名都是一个独立的 3、支持百度自动提交收录&#xff0c;每天随机自动提交无限自己…

echarts图表:类目轴

category 类目轴&#xff0c;适用于离散的类目数据。 例如商品名称、时间等。 类目轴上的每个刻度代表一个类目&#xff0c;刻度之间没有量的关系&#xff0c;只是简单的分类。 在类目轴上&#xff0c;数据点会对应到相应的类目上。

运行前端项目提示 run `npm fund` for details,如何解决?

经常出现在前端的一个小坑&#xff0c;分享一下技巧。 运行npm install命令终端提示&#xff1a; 107 packages are looking for funding run npm fund for details 解决方案&#xff1a; npm install --no-fund

Linux 进程 PID 管理

文章目录 1. 前言2. 进程 PID 相关数据结构3. 进程 PID 的构建3.1 第一个进程 PID 构建3.2 第二个进程 PID 的构建过程3.2.1 从当前进程复制进程 PID 信息3.2.2 创建每进程的 PID 管理数据 (struct pid) 并初始化3.2.3 绑定进程和其相关的 PID 管理数据 3.3 进程的 PID 建立过程…

【Oracle】实验三 Oracle数据库的创建和管理

【实验目的】 掌握Oracle数据库的创建方法使用DBCA创建数据库在数据库中装入SCOTT用户及其表 【实验内容】 使用DBCA创建数据库&#xff0c;名为MYDB&#xff0c;找到其初始化文件(文本型和服务器型文件都要找到)&#xff0c;查看各类默认位置并记录下来(包括物理文件所在目…

LINUX系统编程:基于环形队列和信号量的生产者消费者模型

目录 1.环形队列 2.加上信号量的理解 3.代码 1.环形队列 环形队列使用vector封装出来的。 环形队列可以实现并发生产和消费&#xff0c;就是在消费的同时也可以生产。 这个是建立在生产者消费者位置不重合的情况下。 因为位置重合之后&#xff0c;环形队列为空或者满&#xf…

Linux DRM 那些事 - HDMI 接口 DTS 配置

本文基于RockPI 4A单板Debian系统 Linux 4.4 内核介绍DRM框架HDMI接口DTS配置。 在DTS中主要实现&#xff1a;HDMI的使能、VOP绑定、IOMUX引脚配置和HDMI控制器配置。 一、HDMI 配置 文件&#xff1a;arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi #include "rk3…

C++ 宏

C中的宏是一种预处理指令&#xff0c;用于在编译时将代码中的标识符替换为指定的文本。 #define 指令 1.无参宏定义 无参宏的宏名后不带参数。 其定义的一般形式为&#xff1a; #define 标识符 字符串 其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命…

React:useState和useEffect

最近因为想要开发一个简单的应用才开始接触React。但是并没有系统学习React&#xff0c;所以这篇博客可能会写的不够专业。 1. Hooks 在程序设计语言中&#xff0c;钩子(hook)是一种机制&#xff0c;它可以允许程序在某些预定的事件或位置执行特定的代码。在React中&#xff0c…

水平自动扩容和缩容HPA、Networkpolicy、kubernetes用户安全控制和kubernetes创建普通用户(2024-07-10)

一、水平自动扩容和缩容HPA HPA全称是Horizontal Pod Autoscaler&#xff0c;翻译成中文是POD水平自动伸缩&#xff0c;HPA可以基于CPU利用率对replication controller、deployment和replicaset中的pod数量进行自动扩缩容&#xff08;除了CPU利用率也可以基于其他应程序提供的…