python网络编程--socket简单

发布时间:2019-08-09 10:20:09编辑:auto阅读(1607)

    python网络编程                                                                                                                                    

    一、客户端控制服务端执行命令

    server:

    #!/usr/local/python3/bin/python3.6
    #-*- coding:utf-8 -*-
    #AUTH:FJC
    from socket import *
    from time import ctime
    import subprocess
    HOST = ''           #HOST变量空白,表示可以使用任何地址
    PORT = 21567
    BUFSIZ = 1024       #缓冲区大小为1KB
    ADDR = (HOST,PORT)
    
    tcp_ser_sock = socket(AF_INET,SOCK_STREAM)  #创建套接字对象,AF_INET表示面向网络的,SOCK_STREAM表示用于TCP传输的套接字类型
    tcp_ser_sock.bind(ADDR)     #将地址(主机名、端口号对)绑定到套接字上
    tcp_ser_sock.listen(5)  #设置并启动TCP 监听器,listen的参数表示连接被转接或拒绝之前,传入连接请求的最大数
    
    while True:
        print('waiting for connecting...')
        tcp_cli_sock,addr = tcp_ser_sock.accept()   #返回一个socket对象和属于客户端的套接字
        print('...connect from:',addr)
        while True:
            try:
                data = str(tcp_cli_sock.recv(BUFSIZ),'utf8')
            except Exception:
                break
            if not data:
                continue
            obj = subprocess.Popen(data,shell=True,stdout=subprocess.PIPE)
            result = obj.stdout.read()
            tcp_cli_sock.send(bytes(str(len(result)),'utf8'))
            tcp_cli_sock.recv(BUFSIZ)   #解决粘包现象
            tcp_cli_sock.send(result)
        tcp_cli_sock.close()
    tcp_ser_sock.close()

    client:

    #-*- coding:utf-8 -*-
    #AUTH:FJC
    from socket import *
    from sys import exit
    HOST = '127.0.0.1'
    PORT = 21567
    BUFSIZ = 1024
    ADDR = (HOST,PORT)
    
    tcp_cli_sock = socket(AF_INET,SOCK_STREAM)
    tcp_cli_sock.connect(ADDR)
    
    while True:
        data = input('command>')
        if not data:
            continue
        elif data == ("exit" or "quit"):
            exit(1)
        tcp_cli_sock.send(bytes(data,'utf8'))
        result_len=str(tcp_cli_sock.recv(BUFSIZ),'utf8')
        tcp_cli_sock.send(bytes(1))
        result = bytes()
        while len(result) != int(result_len):
            data_rec = tcp_cli_sock.recv(BUFSIZ)
            result += data_rec
        print(str(result,'gbk'))
    # tcp_cli_sock.close()

    二、文件上传下载

    server:

    #-*- coding:utf-8 -*-
    #AUTH:FJC
    from socket import *
    import os
    
    HOST = ''
    PORT = 21567
    BUFSIZ = 1024
    ADDR = (HOST,PORT)
    tcp_ser_sock = socket(AF_INET,SOCK_STREAM)
    tcp_ser_sock.bind(ADDR)
    tcp_ser_sock.listen(5)
    
    BASE_DIR=os.path.dirname(os.path.abspath(__file__))
    
    def upload():
        file_size = str(tcp_cli_sock.recv(BUFSIZ), 'utf8')
        file_size = int(file_size)
        file_recv = 0
        with open(path, 'ab') as f:
            while file_recv != file_size:
                data = tcp_cli_sock.recv(BUFSIZ)
                f.write(data)
                file_recv += len(data)
    def download():
        file_size = os.stat(path).st_size
        tcp_cli_sock.send(bytes(str(file_size), 'utf8'))
        file_send = 0
        with open(path, 'rb') as f:
            while file_send != file_size:
                data = f.read(1024)
                tcp_cli_sock.send(data)
                file_send += len(data)
    if __name__ == '__main__':
        while True:
            print('waiting for connecting...')
            tcp_cli_sock, addr = tcp_ser_sock.accept()
            print('...connect from:', addr)
            try:
                up_down_info = str(tcp_cli_sock.recv(BUFSIZ), 'utf8')
                cmd, path = up_down_info.split('|')
                filename = os.path.basename(path)
                path = os.path.join(BASE_DIR, 'server_dir', filename)
                if cmd == 'get':
                    download()
                elif cmd == 'post':
                    upload()
            except Exception:
                continue
        tcp_cli_sock.close()

    client:

    #-*- coding:utf-8 -*-
    #AUTH:FJC
    from socket import *
    from sys import exit
    import os
    
    HOST = '127.0.0.1'
    PORT = 21567
    BUFSIZ = 1024
    ADDR = (HOST,PORT)
    
    BASE_DIR=os.path.dirname(os.path.abspath(__file__))
    
    def get():
        file_size = str(tcp_cli_sock.recv(BUFSIZ), 'utf8')
        print(type(file_size))
        file_size = int(file_size)
        file_recv = 0
        with open(path, 'ab') as f:
            while file_recv != file_size:
                data = tcp_cli_sock.recv(BUFSIZ)
                f.write(data)
                file_recv += len(data)
        print("文件下载成功!")
    def post():
        file_size = os.stat(path).st_size
        tcp_cli_sock.send(bytes(str(file_size), 'utf8'))
        file_send = 0
        with open(path, 'rb') as f:
            while file_send != file_size:
                data = f.read(1024)
                tcp_cli_sock.send(data)
                file_send += len(data)
        print("文件上传成功!")
    
    if __name__ == '__main__':
        while True:
            tcp_cli_sock = socket(AF_INET, SOCK_STREAM)
            tcp_cli_sock.connect(ADDR)
            command = input('(command|file)>')
            if not command:
                continue
            elif command == "exit" or command == "quit":
                exit(1)
            cmd,path = command.split('|')
            up_down_info = '%s|%s' % (cmd, path)
            filename = os.path.basename(path)
            tcp_cli_sock.send(bytes(up_down_info, 'utf8'))
            path = os.path.join(BASE_DIR, filename)
            if cmd == 'get':
                get()
            if cmd == 'post':
                post()
            tcp_cli_sock.close()


    网络编程基础知识



关键字