欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-18 13:51:21
python socket多线程实现客户端与服务器连接,供大家参考,具体内容如下之前因为一些作业需要完成一个服务器监听多个客户端的程序,于是就用python写了这样的程序。话不多说,直接上代码。ser...

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多线程实现客户端与服务器连接

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

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