Python多线程Socket编程:实现多客户端接入与服务端处理
本文介绍如何使用Python的SocketServer模块构建支持多客户端接入的服务端。通过ThreadingTCPServer实现多线程处理,无需手动管理子线程和Socket关闭。文章包含客户端连接代码与服务端处理逻辑示例,基于Python 3.6.2及RHEL 7.2环境测试,提供完整的收发交互流程与注意事项。
在Python中实现Socket通信时,服务端逻辑相对复杂,而客户端实现则较为简单。因此,客户端通常直接使用socket模块进行开发,而服务端则有多种模块可供选择,具体如下:

1、客户端实现
#!/usr/bin/env python
#coding:utf-8
'''
file:client.py
date:9/9/17 3:43 PM
author:lockey
email:lockey@123.com
desc:socket编程客户端,python3.6.2
'''
import socket,sys
HOST = '192.168.1.6'
PORT = 8998
ADDR =(HOST,PORT)
BUFSIZE = 1024
sock = socket.socket()
try:
sock.connect(ADDR)
print('have connected with server')
while True:
data = input('lockey# ')
if len(data)>0:
print('send:',data)
sock.sendall(data.encode('utf-8')) #不要用send()
recv_data = sock.recv(BUFSIZE)
print('receive:',recv_data.decode('utf-8'))
else:
sock.close()
break
except Exception:
print('error')
sock.close()
sys.exit()
2、SocketServer模块应用
为了实现多个客户端同时接入服务端并进行通信,服务端采用SocketServer模块。使用该模块后,用户无需在子线程结束后手动利用父进程进行处理,也无需关心Socket的关闭操作,这些工作均由SocketServer自动完成。
#!/usr/bin/env python
#coding:utf-8
'''
file:client.py
date:9/9/17 3:43 PM
author:lockey
email:lockey@123.com
desc:socket编程服务器端,python3.6.2
'''
from socketserver import BaseRequestHandler,ThreadingTCPServer
import threading
BUF_SIZE=1024
class Handler(BaseRequestHandler):
def handle(self):
address,pid = self.client_address
print('%s connected!'%address)
while True:
data = self.request.recv(BUF_SIZE)
if len(data)>0:
print('receive=',data.decode('utf-8'))
cur_thread = threading.current_thread()
#response = '{}:{}'.format(cur_thread.ident,data)
self.request.sendall('response'.encode('utf-8'))
print('send:','response')
else:
print('close')
break
if __name__ == '__main__':
HOST = '192.168.1.6'
PORT = 8998
ADDR = (HOST,PORT)
server = ThreadingTCPServer(ADDR,Handler) #参数为监听地址和已建立连接的处理类
print('listening')
server.serve_forever() #监听,建立好TCP连接后,为该连接创建新的socket和线程,并由处理类中的handle方法处理
print(server)
在以下测试中,使用另外一台主机以及本机的两个终端连接服务器,均能正常连接并进行数据应答交互。

注意:此程序示例运行平台为rhel7.2.x86_64,python版本为3.6.2。对于windows平台和非同一python版本的用户可能缺乏一定的兼容性,如果是其他平台用户请自行修正!!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













