• socket操作


    1在socket中怎么实现一个服务器端同时跟好几个客服端进行通信呢,在socketserver中实现了socket+并发的功能

    #------服务器端-------
    
    import socketserver
    
    class MyServer(socketserver.BaseRequestHandler):
    
        def handle(self):
            print ("服务端启动...")
            while True:
                conn = self.request
                print (self.client_address)
                while True:
    
                    client_data=conn.recv(1024)
    
                    print (str(client_data,"utf8"))
                    print ("waiting...")
                    server_response=input(">>>")
                    conn.sendall(bytes(server_response,"utf8"))
                    # conn.sendall(client_data)
    
                conn.close()
                # print self.request,self.client_address,self.server
    
    
    if __name__ == '__main__':
        server = socketserver.ThreadingTCPServer(('127.0.0.1',8098),MyServer)
        server.serve_forever()
    #----客户端------
    import socket
    
    
    ip_port = ('127.0.0.1',8098)
    sk = socket.socket()
    sk.connect(ip_port)
    print ("客户端启动:")
    while True:
        inp = input('>>>')
        sk.sendall(bytes(inp,"utf8"))
        server_response=sk.recv(1024)
        print (str(server_response,"utf8"))
        if inp == 'exit':
            break
    sk.close()

     2、利用socket实现文件的上传和下载

    import socket
    import struct
    import json
    import subprocess
    import os
    
    
    class MYTCPServer:
        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
        server_dir = 'file_upload'
    
        def __init__(self, server_address, bind_and_activate=True):
            """Constructor.  May be extended, do not override."""
            self.server_address = server_address
            self.socket = socket.socket(self.address_family,
                                        self.socket_type)
            if bind_and_activate:
                try:
                    self.server_bind()
                    self.server_activate()
                except:
                    self.server_close()
                    raise
    
        def server_bind(self):
            """Called by constructor to bind the socket.
            """
            if self.allow_reuse_address:
                self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.socket.bind(self.server_address)
            self.server_address = self.socket.getsockname()
    
        def server_activate(self):
            """Called by constructor to activate the server.
            """
            self.socket.listen(self.request_queue_size)
    
        def server_close(self):
            """Called to clean-up the server.
            """
            self.socket.close()
    
        def get_request(self):
            """Get the request and client address from the socket.
            """
            return self.socket.accept()
    
        def close_request(self, request):
            """Called to clean up an individual request."""
            request.close()
    
        def run(self):
            while True:
                self.conn, self.client_addr = self.get_request()
                print('from client ', self.client_addr)
                while True:
                    try:
                        head_struct = self.conn.recv(4)
                        if not head_struct: break
                        head_len = struct.unpack('i', head_struct)[0]
                        head_json = self.conn.recv(head_len).decode(self.coding)
                        head_dic = json.loads(head_json)
                        # print(head_dic)
                        # head_dic={'cmd':'put','filename':'a.txt','filesize':123123}
                        cmd = head_dic['cmd']
                        if hasattr(self, cmd):
                            func = getattr(self, cmd)
                            func(head_dic)
                    except Exception:
                        break
    
        # {'cmd': cmd, 'filename': os.path.basename(filename), 'filesize': None,'message':None}
        def get(self,args):
            file_path = os.path.normpath(os.path.join(
                self.server_dir,
                args['filename']
            ))
            print('文件的位置',os.path.abspath(file_path))
            if not os.path.exists(file_path):
                args['message'] = 'file not exists'
            else:
                filesize = os.path.getsize(file_path)
                args['filesize'] =  filesize
            print(args)
            head_json = json.dumps(args)
            head_json_bytes = bytes(head_json, encoding=self.coding)
            head_struct = struct.pack('i', len(head_json_bytes))
            self.conn.send(head_struct)
            self.conn.send(head_json_bytes)
            if args['message'] :
                print('下载文件不存在,请重新输入')
                return
            send_size = 0
            with open(file_path, 'rb') as f:
                for line in f:
                    self.conn.send(line)
                    send_size += len(line)
                else:
                    print('down successful')
                print('发送文件的大小', send_size)
    
        def put(self, args):
            file_path = os.path.normpath(os.path.join(
                self.server_dir,
                args['filename']
            ))
            print('文件存储的位置',os.path.abspath(file_path))
            filesize = args['filesize']
            recv_size = 0
            print('----->', file_path)
            with open(file_path, 'wb') as f:
                while recv_size < filesize:
                    recv_data = self.conn.recv(self.max_packet_size)
                    f.write(recv_data)
                    recv_size += len(recv_data)
                    print('recvsize:%s filesize:%s' % (recv_size, filesize))
    
    
    tcpserver1 = MYTCPServer(('127.0.0.1', 8080))
    tcpserver1.run()
    服务端代码
    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 get(self,args):
            cmd = args[0]
            filename = args[1]
            if  os.path.isfile(filename):
                print('file:%s 已经存在' % filename)
                return
            head_dic = {'cmd': cmd, 'filename': os.path.basename(filename), 'filesize': None,'message':None}
            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)
    
            head_struct = self.socket.recv(4)
            head_len = struct.unpack('i', head_struct)[0]
            head_json = self.socket.recv(head_len).decode(self.coding)
            head_dic = json.loads(head_json)
            print(head_dic)
            recv_size = 0
            print('----->', filename)
            filesize = head_dic['filesize']
            if filesize:
                with open(filename, 'wb') as f:
                    while recv_size < filesize:
                        recv_data = self.socket.recv(self.max_packet_size)
                        f.write(recv_data)
                        recv_size += len(recv_data)
                        print('recvsize:%s filesize:%s' % (recv_size, filesize))
                    print('down successful')
            else:
                print(head_dic['message'])
                return
    
        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()
    客户端代码
    人生苦短,我用cnblog
  • 相关阅读:
    06python 中的递归函数(python函数)
    05python 的内置函数以及匿名函数(python函数)
    Elasticsearch6.x集群部署
    SuperMap iServer之CAS单点登陆搭建流程
    大数据系列文章-Hadoop的HDFS读写流程(二)
    大数据系列文章-Hadoop基础介绍(一)
    SuperMap iObjects for Spark使用
    Hadoop集群+Spark集群搭建(一篇文章就够了)
    Linux配置 xampp下的https证书(腾讯云申请)
    SuperMap iServer 9D HBase使用
  • 原文地址:https://www.cnblogs.com/wuzhibinsuib/p/12713227.html
Copyright © 2020-2023  润新知