zoukankan      html  css  js  c++  java
  • Python3 中socket使用

    1.动态导入模块

    在当前目录下有lib和test目录,在test中要想使用lib中的aa的C类:

    test中:

    第一种方法:推荐

    importlib.import_module('lib.aa')

    obj = aa.c()

    第二种方法:(python内部解释器用的)

    lib = __import__("lib.aa")

    obj  = lib.aa.C()

    2.断言:assert(预判,断定)

    assert type("dsds") is str

    print("yes")

    如果断言错误,即"dsds"的类型不是str,则程序不能继续运行,会报错

    若接下来的代码运行时非常重要,最好提前用断言

    2.socket

    Socket Families(地址簇)

    socket.AF_UNIX unix本机进程间通信 

    socket.AF_INET IPV4 

    socket.AF_INET6  IPV6

    Socket Types  类型

    socket.SOCK_STREAM  #for tcp

    socket.SOCK_DGRAM   #for udp 

    实际例子:

    服务器端:

    import socket
    
    server = socket.socket()
    server.bind(('localhost',6969))
    server.listen(5)
    
    print('The server is ready')
    while True:
        conn,addr = server.accept()
        print('The client is connected !!!')
        while True:
            data = conn.recv(1024)
            print('recv:',data.decode())
            conn.send(data.upper())
    server.close
    

    客户端:

    import socket
    
    client = socket.socket()
    client.connect(('localhost',6969))
    
    while True:
        msg = input('ibput>>').strip()
        if len(msg) == 0:
            continue
        client.send(msg.encode('utf-8'))
        data = client.recv(1024)
        print('recv:',data.decode())
    client.close()
    

    实现回显数据:

    服务器:

    import socket,os
    
    server = socket.socket()
    server.bind(('localhost',6969))
    server.listen(5)
    
    print('The server is ready')
    while True:
        conn,addr = server.accept()
        print('The client is connected !!!')
        while True:
            data = conn.recv(1024)
            if not data:
                break
            # print('recv:',data.decode())
            # conn.send(data.upper())
            res = os.popen(data.decode()).read()
            print('before send:',len(res))
            if len(res) == 0:
                res = 'cmd has no input'
            conn.send(res.encode())
    server.close
    

    客户端:

    import socket
    
    client = socket.socket()
    client.connect(('localhost',6969))
    
    while True:
        msg = input('ibput>>').strip()
        if len(msg) == 0:
            continue
        client.send(msg.encode('utf-8'))
        data = client.recv(1024)
        print('recv:',data.decode())
    client.close()
    

    可以回显全部的数据

    利用了循环知道返回全部的数据长度

    服务器端:

    import socket,os
    server = socket.socket()
    server.bind(('localhost',6969))
    server.listen(5)
    print('The server is ready')
    while True:
        conn,addr = server.accept()
        print('The client is connected !!!')
        while True:
            data = conn.recv(1024)
            if not data:
                break
            res = os.popen(data.decode()).read()
            print('before send:',len(res))
            if len(res) == 0:
                res = 'cmd has no input'
            conn.send(str(len(res.encode())).encode())
            conn.send(res.encode())
    server.close
    

    客户端:

    import socket
    client = socket.socket()
    client.connect(('localhost',6969))
    while True:
        msg = input('ibput>>').strip()
        if len(msg) == 0:
            continue
        client.send(msg.encode('utf-8'))
        data_size = client.recv(1024)
        print("The size is :",data_size.decode())
        received_size = 0
        received_data = b''
        while received_size < int(data_size.decode()):
            data = client.recv(1024)
            received_size += len(data)
            received_data += data
            print(received_size)
        else:
            print('cmd res receive done...',received_size)
        print(data.decode())
    client.close()
    

    实现FTP的下载功能:

    服务器:

    import socket,os,hashlib
    server = socket.socket()
    server.bind(('localhost',6969))
    server.listen(5)
    print('The server is ready')
    while True:
        conn,addr = server.accept()
        print('The client is connected !!!')
        while True:
            data = conn.recv(1024)
            if not data:
                print('The client is gone...')
                break
            cmd,filename = data.decode().split()
            print(filename)
            if os.path.isfile(filename):
                f = open(filename,'rb')
                m = hashlib.md5()
                file_size = os.stat(filename).st_size
                conn.send(str(file_size).encode())
                conn.recv(1024) #wait for ack
                for line in f:
                    m.update(line)
                    conn.send(line)
                print('file md5',m.hexdigest())
                f.close()
            print('send done')
    server.close
    

    客户端:

    import socket
    client = socket.socket()
    client.connect(('localhost',6969))
    while True:
        cmd = input('ibput>>').strip()
        if len(cmd) == 0:
            continue
        if cmd.startwith('get'):
            client.send(cmd.encode('utf-8'))
            server_reponse = client.recv(1024)
            print('server response:',server_reponse)
            client.send(b'ready to recv file')
            file_total_size = int(server_reponse.decode())
            received_size = 0
            filename = cmd.split()[1]
            f = open(filename + '.new','wb')
            while received_size < file_total_size:
                data = client.recv(1024)
                received_size += len(data)
                f.write(data)
                print(file_total_size,received_size)
            else:
                print('file recv done',file_total_size,received_size)
                f.close()
    client.close()
    

    实现FTP的交互:

    服务器:

    import socketserver,json,os
    
    class MyTCPHandler(socketserver.BaseRequestHandler):
        def put(self,*args):
            '''接收客户端文件'''
            cmd_dic = args[0]
            filename = cmd_dic['filename']
            filesize = cmd_dic['size']
            if os.path.isfile(filename):
                f = open(filename+'.new','wb')
            else:
                f = open(filename,'wb')
    
            self.request.send(b'200 ok')
            received_size = 0
            while received_size < filesize:
                data = self.request.recv(1024)
                f.write(data)
                received_size += len(data)
            else:
                print('file [%s] has uploaded'%filename)
                f.close()
        def get(self,*args):
            cmd_dic = args[0]
            filename = cmd_dic['filename']
            filesize = os.stat(filename).st_size
            if os.path.isfile(filename):
                self.request.send(str(filesize).encode())
                client_request = self.request.recv(1024)
                f = open(filename,'rb')
                for line in f:
                    self.request.send(line)
                else:
                    f.close()
            else:
                print('file [%s] is not exist...'%filename)
    
        def handle(self):
            while True:
                try:
                    print('{} wrote:'.format(self.client_address[0]))
                    self.data = self.request.recv(1024).strip()
                    print(self.data)
                    cmd_dic = json.loads(self.data.decode())
                    action = cmd_dic['action']
                    if hasattr(self,action):
                        func = getattr(self,action)
                        func(cmd_dic)
                except ConnectionResetError as e:
                    print('err',e)
                    break
    
    if __name__ == '__main__':
        HOST,PORT = 'localhost',9999
        server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
        server.serve_forever()
    

    客户端:

    import socket,os,json
    
    class FtpClient(object):
        def __init__(self):
            self.client = socket.socket()
        def help(self):
            msg = '''
            ls
            pwd
            cd ../..
            get filename
            put filename
            '''
            print(msg)
        def connect(self):
            self.client.connect(('localhost',9999))
        def interaction(self):
            #self.authenticate()
            while True:
                cmd = input('>>').strip()
                if len(cmd) == 0:continue
                cmd_str = cmd.split()[0]
                if hasattr(self,'cmd_%s'%cmd_str):
                    func = getattr(self,'cmd_%s'%cmd_str)
                    func(cmd)
                else:
                    self.help()
        def cmd_put(self,*args):
            cmd_spilt = args[0].split()
            if len(cmd_spilt) > 1:
                filename = cmd_spilt[1]
                if os.path.isfile(filename):
                    filesize = os.stat(filename).st_size
                    msg_dic = {
                        'action':'put',
                        'filename':filename,
                        'size':filesize,
                        'overridden':True
                    }
                    self.client.send(json.dumps(msg_dic).encode('utf-8'))
                    #防止粘包,等服务器确认
                    server_reponse = self.client.recv(1024)
                    f = open(filename,'rb')
                    for line in f:
                        self.client.send(line)
                    else:
                        print('file uupload success...')
                        f.close()
                else:
                    print(filename,'is not exist')
        def cmd_get(self,*args):
            cmd_spilt = args[0].split()
            if len(cmd_spilt) > 1:
                filename = cmd_spilt[1]
                msg_dic = {
                    'action': 'get',
                    'filename': filename
                }
                self.client.send(json.dumps(msg_dic).encode('utf-8'))
                filesize = self.client.recv(1024)
                self.client.send(b'200 ok')
                if os.path.isfile(filename):
                    f = open(filename+'.new','wb')
                else:
                    f = open(filename,'wb')
                receive_size = 0
                while int(filesize.decode()) > receive_size:
                    data = self.client.recv(1024)
                    f.write(data)
                    receive_size += len(data)
                else:
                    print('file [%s] is downloaded...'%filename)
                    f.close()
    
    ftp = FtpClient()
    ftp.connect()
    ftp.interaction()
    

     使用方法:例如get filename  或者   put filename

  • 相关阅读:
    结对作业
    黄金分割点(第五周 c语言版)
    小程序(第四周)
    读程序作业(第三周)
    vs2013的安装及测试(第三周)
    学习进度条(第6周)
    努力爬的蜗牛
    学习日记1
    团队作业(七)
    团队作业(六)
  • 原文地址:https://www.cnblogs.com/hjc4025/p/6611434.html
Copyright © 2011-2022 走看看