Python3 Socket聊天编程:从基础到多线程并发实现
本文详解基于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、客户端表现:

以上内容为本文全部总结,希望对读者的学习有所帮助,欢迎继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









