新闻动态

python socket多线程实现客户端与服务器连接

发布日期:2022-01-26 15:30 | 文章来源:站长之家

python socket多线程实现客户端与服务器连接,供大家参考,具体内容如下

之前因为一些作业需要完成一个服务器监听多个客户端的程序,于是就用python写了这样的程序。话不多说,直接上代码。

server代码:

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()

server服务器类,主要是监听以及接收客户端的信息。

#实例化一个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)

Client代码

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()

以上为客户端程序的代码。

下面是运行的结果:

服务器端:

多个客户端:

代码实现还是蛮容易的,具体可以自行修改使用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部