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

时间:2021-08-02 18:41:01

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

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

下面是运行的结果:

服务器端:

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

多个客户端:

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

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

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

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

原文链接:https://blog.csdn.net/weixin_43898483/article/details/110817406