网络编程
位置:首页>> 网络编程>> Python编程>> python socket多线程实现客户端与服务器连接

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

作者:上不了山的小非洲  发布时间:2021-09-06 15:44:01 

标签:python,客户端,服务器

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

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com