zoukankan      html  css  js  c++  java
  • Python Socket多线程并发

    1.SocketServer模块编写的TCP服务器端代码

     Socketserver原理图

        

    服务端:

    import SocketServer            #导入SocketServer,多线程并发由此类实现
     
    class MySockServer(SocketServer.BaseRequestHandler):    #定义一个类
     
        def handle(self):      #handle(self)方法是必须要定义的,可以看上面的说明
            print 'Got a new connection from', self.client_address
            while True:
                data = self.request.recv(1024)    #需要通过self的方法调用数据接收函数
                if not data:break
                print 'recv:', data
     
                self.request.send(data.upper())   #需要通过self的方法调用数据接收函数
     
    if __name__ == '__main__':    #并非一定要用这样的方式,只是建议这样使用
        HOST = ''             #定义侦听本地地址口(多个IP地址情况下),这里表示侦听所有
        PORT = 50007          #Server端开放的服务端口
        s = SocketServer.ThreadingTCPServer((HOST, PORT), MySockServer)
                                  #调用SocketServer模块的多线程并发函数
        s.serve_forever()     #持续接受客户端的连接

    客户端:

    import socket
     
    HOST = '192.168.1.13'
    PORT = 50007
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
     
    while True:
        user_input = raw_input('msg to send:').strip()
        s.sendall(user_input)
        data = s.recv(1024)
        print 'Received', repr(data)
     
    s.close()

     2.基于Python Socketserver的实现的FTP程序

     服务端:

    import socketserver
    import struct
    import json
    import os
    class FtpServer(socketserver.BaseRequestHandler):
        coding='utf-8'
        server_dir='file_upload'
        max_packet_size=1024
        BASE_DIR=os.path.dirname(os.path.abspath(__file__))
        def handle(self):
            print(self.request)
            while True:
                data=self.request.recv(4)
                data_len=struct.unpack('i',data)[0]
                head_json=self.request.recv(data_len).decode(self.coding)
                head_dic=json.loads(head_json)
                # print(head_dic)
                cmd=head_dic['cmd']
                if hasattr(self,cmd):
                    func=getattr(self,cmd)
                    func(head_dic)
        def put(self,args):
            file_path = os.path.normpath(os.path.join(
                self.BASE_DIR,
                self.server_dir,
                args['filename']
            ))
    
            filesize = args['filesize']
            recv_size = 0
            print('----->', file_path)
            with open(file_path, 'wb') as f:
                while recv_size < filesize:
                    recv_data = self.request.recv(self.max_packet_size)
                    f.write(recv_data)
                    recv_size += len(recv_data)
                    print('recvsize:%s filesize:%s' % (recv_size, filesize))
    
    
    ftpserver=socketserver.ThreadingTCPServer(('127.0.0.1',8080),FtpServer)
    ftpserver.serve_forever()

     客户端:

    import socket
    import struct
    import json
    import os
    
    
    
    class MYTCPClient:
        address_family = socket.AF_INET
    
        socket_type = socket.SOCK_STREAM
    
        allow_reuse_address = False
    
        max_packet_size = 8192
    
        coding='utf-8'
    
        request_queue_size = 5
    
        def __init__(self, server_address, connect=True):
            self.server_address=server_address
            self.socket = socket.socket(self.address_family,
                                        self.socket_type)
            if connect:
                try:
                    self.client_connect()
                except:
                    self.client_close()
                    raise
    
        def client_connect(self):
            self.socket.connect(self.server_address)
    
        def client_close(self):
            self.socket.close()
    
        def run(self):
            while True:
                inp=input(">>: ").strip()
                if not inp:continue
                l=inp.split()
                cmd=l[0]
                if hasattr(self,cmd):
                    func=getattr(self,cmd)
                    func(l)
    
    
        def put(self,args):
            cmd=args[0]
            filename=args[1]
            if not os.path.isfile(filename):
                print('file:%s is not exists' %filename)
                return
            else:
                filesize=os.path.getsize(filename)
    
            head_dic={'cmd':cmd,'filename':os.path.basename(filename),'filesize':filesize}
            print(head_dic)
            head_json=json.dumps(head_dic)
            head_json_bytes=bytes(head_json,encoding=self.coding)
    
            head_struct=struct.pack('i',len(head_json_bytes))
            self.socket.send(head_struct)
            self.socket.send(head_json_bytes)
            send_size=0
            with open(filename,'rb') as f:
                for line in f:
                    self.socket.send(line)
                    send_size+=len(line)
                    print(send_size)
                else:
                    print('upload successful')
    
    
    
    
    client=MYTCPClient(('127.0.0.1',8080))
    
    client.run()
  • 相关阅读:
    react native android9 axios network error
    .NET Core3.1升级.NET5 oracle连接报错
    asp.net mvc api swagger 配置
    ASP.NET Core3.1 中使用MongoDB基本操作
    基于.NET Core3.1的SQLiteHelper增删改帮助类
    linux离线安装gcc 和g++
    简单验证两次密码输入是否相同
    循环结构-回文数
    《暴走大事件》为80、90后正名
    循环结构-判断一个数是否为完全数(C语言)
  • 原文地址:https://www.cnblogs.com/vipchenwei/p/7205872.html
Copyright © 2011-2022 走看看