Python3 Socket聊天编程:从基础到多线程并发实现

慢慢来
慢慢来
发布时间:2026-10-13| 4人浏览过
原创

本文详解基于Python3的Socket聊天系统开发,涵盖从最简易的单线程交互到多线程并发聊天的完整实现。重点解析bytes与str编码转换、socket通信机制及多线程在解决收发阻塞问题中的应用,提供Server与Client端完整代码示例,帮助开发者掌握Python网络编程核心技能。

Python3 Socket聊天编程概述

本文分享基于Python3的Socket聊天编程实例,供读者参考学习。

第一阶段:简易聊天系统实现

第一阶段:构建最简易的聊天系统。

该阶段存在明显局限:程序逻辑不完善,仅支持一问一答模式,且双方每次交互只能发送一条消息。

服务器端代码实现如下:


import socket
HostPort = ('127.0.0.1',9999)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(HostPort)
s.listen(1)
conn,addr = s.accept()
#print('Connecting by : %s ' % addr)
while 1:
 data = conn.recv(1024).decode()
 print (data)
 user_input = input('>>>')
 conn.send(user_input.encode('utf8'))
 #conn.close()
s.close()

客户端代码实现如下:


import socket
hostport = ('127.0.0.1',9999)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(hostport)
 
while 1:
 user_input = input('>>> ').strip()
 s.send(user_input.encode('utf-8'))
 if len(user_input) == 0:
 continue
 if user_input == 'quit':
 s.close()
 break
 server_reply = s.recv(1024).decode()
 print (server_reply)

关键注意事项:在Python3环境中,bytes与str是两种截然不同的数据类型。send和recv方法处理的数据均为bytes类型。将str转换为bytes需使用encode('utf8')方法,而将bytes还原为str则需使用decode()方法。

此阶段服务稳定性较差,连接易断开。因此进入下一阶段,旨在支持双方自由发送多条消息。

第二阶段:多线程并发聊天系统

第二阶段:实现多线程并发聊天系统。

针对第一阶段中服务器与客户端只能交替收发、无法自由交互的问题,引入多线程机制。我们将消息接收功能独立为一个线程,从而实现服务器与客户端同时发送多条消息且互不干扰接收的功能。

具体代码实现如下:

服务器端代码:


import socket
import threading # 导入多线程模块
print("Waitting to be connected......")
HostPort = ('127.0.0.1',9999)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 创建socket实例
s.bind(HostPort)
s.listen(1)
conn,addr = s.accept()
true=True
addr = str(addr)
print('Connecting by : %s ' %addr )
def Receve(conn):   # 将接收定义成一个函数
 global true # 声明全局变量,当接收到的消息为quit时,则触发全局变量 true = False,则会将socket关闭
 while true:
 data = conn.recv(1024).decode('utf8') 
 if data == 'quit':
 true=False
 print("you have receve: "+data+" from"+addr) # 当接收的值为'quit'时,退出接收线程,否则,循环接收并打印
thrd=threading.Thread(target=Receve,args=(conn,)) # 线程实例化,target为方法,args为方法的参数 
thrd.start()    # 启动线程
while true:
 user_input = input('>>>')
 conn.send(user_input.encode('utf8'))  # 循环发送消息
 if user_input == 'quit':   # 当发送为‘quit'时,关闭socket
 true = False
 #conn.close()
s.close()

客户端代码:


import socket
import threading
hostport = ('127.0.0.1',9999)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(hostport)
true = True
def Receve(s):
 global true
 while true:
 data = s.recv(1024).decode('utf8')
 if data == 'quit':
 true = False
 print('recevie news:\033[5;37;46m%s\033[0m' % data )
thrd=threading.Thread(target=Receve,args=(s,))
thrd.start()
while true:
 user_input = input('>>>')
 s.send(user_input.encode('utf8'))
 if user_input == 'quit':
 true = False
s.close()

运行效果展示(紫色字体代表接收到的消息,白色字体代表发送的消息)。任意一方输入'quit'即可退出程序。

1、服务器端表现:相比第一阶段,现在服务器无需等待接收消息即可主动发送,实现了随时主动发送的功能。

2、客户端表现:

以上内容为本文全部总结,希望对读者的学习有所帮助,欢迎继续支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。