Python Socket多线程实现客户端与服务器连接
本文介绍如何使用Python的Socket库结合多线程技术,实现一个能够同时监听并处理多个客户端连接的服务器程序。通过示例代码展示了服务器端接收连接、创建独立线程处理消息,以及客户端发送请求的完整流程,帮助开发者快速掌握并发网络编程的基础实现。
Python Socket多线程实现客户端与服务器连接
本文介绍如何利用Python的Socket库结合多线程技术,实现一个能够同时监听并处理多个客户端连接的服务器程序。
此前因作业需求,需要编写一个能监听多个客户端的服务器程序,因此使用Python完成了该实现。
服务器端代码实现
以下是服务器端的核心代码实现。
服务器核心逻辑
import json
import socket
import threading
import time
import struct
class Server():
def __init__(self):
self.g_conn_pool = {} # 连接池
# 记录客户端数量
self.num =0
# 服务器本地地址
self.address = ('0.0.0.0', 8000)
# 初始化服务器
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server_socket.bind(self.address)
self.server_socket.listen(128)
def accept_client(self):
"""
接收新连接
"""
while True:
client_socket, info = self.server_socket.accept() # 阻塞,等待客户端连接
print(client_socket,port)
# 给每个客户端创建一个独立的线程进行管理
thread = threading.Thread(target=self.recv_msg, args=(client_socket,info))
thread.setDaemon(True)
thread.start()
def recv_msg(self,client,info):
# 提示服务器开启成功
print('服务器已准备就绪!')
client.sendall("connect server successfully!".encode(encoding='utf8'))
# 持续接受客户端连接
while True:
try:
client.sendall(b'Success')
while True:
msg = client.recv(1024)
msg_recv = msg.decode('utf-8')
if not msg_recv:
continue
else:
recv_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print('客户端 ' + recv_time + ':\n')
print(' ' + msg_recv + '\n')
except Exception as e:
print('客户端断开连接...')
exit(-1)
break
def start_new_thread(self):
"""启动新线程来接收信息"""
thread = threading.Thread(target=self.accept_client, args=())
thread.setDaemon(True)
thread.start()
服务器类主要职责是监听端口以及接收来自客户端的消息。
服务器启动配置
#实例化一个Flask节点
app = Flask(__name__)
@app.route('/')
def hello():
return 'hello'
if __name__ == '__main__':
#创建解析器
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument('-p', '--port', default=5030, type=int, help='port to listen on')
args = parser.parse_args()
#获取端口号
port = args.port
#实例化一个server类 并启动
py_server = Server()
py_server.start_new_thread()
#启动Flask节点
app.run(host='127.0.0.1',port=port)
客户端代码实现
以下是客户端程序的代码部分。
客户端核心逻辑
class Client():
def __init__(self):
#服务器ip与端口
self.server_address = ('127.0.0.1', 8000)
self.num = 0
def recv_msg(self):
print("正在连接服务器....")
# 客户端连接服务器
while True:
try:
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#连接服务器
self.client_socket.connect(self.server_address)
num = self.num
# 制作报头
header_dic = {
'filename': num
}
header_bytes = json.dumps(header_dic).encode('utf-8')
self.client_socket.send(struct.pack('i', len(header_bytes)))
self.client_socket.send(header_bytes)
#接收信息
while True:
msg_recv = self.client_socket.recv(1024).decode('gbk')
print(msg_recv)
if msg_recv == 'Success':
print('客户端已与服务器成功建立连接...')
elif not msg_recv:
continue
else:
recv_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print( '服务器 ' + recv_time + ':\n')
print(' ' + msg_recv + '\n')
except:
print('与服务器断开连接...')
break
def start_new_thread(self):
"""启动新线程来接收信息"""
thread = threading.Thread(target=self.recv_msg, args=())
thread.setDaemon(True)
thread.start()
def main():
wf = Client()
wf.start_new_thread()
while True:
a = input()
wf.client_socket.send(a.encode('utf-8'))
if __name__ == '__main__':
main()
上述代码展示了客户端的基本实现逻辑。
运行结果展示
接下来展示程序运行时的实际效果。
服务器端的运行输出如下。

多个客户端同时连接时的运行状态如下。


代码实现相对简单,用户可根据实际需求进行修改和扩展。
希望本文内容能对学习有所帮助,欢迎继续支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









