zoukankan      html  css  js  c++  java
  • 人生苦短之我用Python篇(socket编程)

    socket模块

    实现简单的远程连接:

    客户端:

    import socket
    client = socket.socket()#声明socket类型,同时生成socke连接t对象
    client.connect(('localhost',969))  #连接到localhost主机的6969端口上去
    while True:
            msg = input(">>:").strip()
            if len(msg) == 0:continue
            client.send(msg.encode('utf-8'))#把编译成utf-8的数据发送出去
            data = client.recv(512)#接收数据
            print("从服务器接收到的数据为:",data.decode())
    client.close()

    服务器端:

    import socket
    import os
    server = socket.socket()#声明socket类型,并且生成socket连接对象
    server.bind(('localhost',969))#把服务器绑定到localhost的6969端口上
    server.listen(5)#开始监听
    print("等待连接中……")
    while True:
            conn,addr = server.accept()#接收连接
            print("***连接成功***")
            while True:
                    data = conn.recv(512)#接收客户发来的数据
                    print("接收到的命令为:",data)
                    if not data:
                            print("客户断开连接")
                            break
                    com = os.popen(data.decode()).read()#read()读取内存地址的内容
                    print(data.decode())#输出结果为字符串dir
                    print(os.popen(data.decode()))#输出结果为一个内存地址
                    #py3 里socket发送的只有bytes,os.popen又只能接受str,所以要decode一下
                    conn.sendall(com.encode('utf-8'))
    server.close()

     稍微加强了下的远程连接:

    客户端:

    import socket
    client = socket.socket()#声明socket类型并生产连接对象
    client.connect(('localhost',9999))#发起连接
    #循环输入指令
    while True:
        cmd = input('>>:').strip()
        if len(cmd) == 0: continue#如果输入为空则跳过本次循环,重新返回输入指令
        client.send(cmd.encode("utf-8"))#把字符串编译成比特流发送
        cmd_res_size = client.recv(1024)#接收服务器发来的指令内容比特流大小
        print("命令结果大小:",cmd_res_size)
        received_size = 0#接收到的大小为0
        received_data = b''#接收到的数据内容为空
        #根据接收到的数据大小,循环接受数据使其生成完整的内容再跳出循环
        while received_size < int(cmd_res_size.decode()):
            data = client.recv(1024)
            received_size += len(data)
            received_data += data
        #跳出循环后执行
        else:
            print("cmd res receive done……",received_size)
            print(received_data.decode())
    
    client.close()

    服务器端:

    import socket ,os
    server = socket.socket()#声明socket类型并生产连接对象
    server.bind(('localhost',9999))#绑定ip和port
    server.listen()#监听
    print('等待连接……')
    #循环接入
    while True:
        conn,addr = server.accept()
        print('new conn:',addr)
        #循坏等待指令
        while True:
            print("等待新指令")
            data = conn.recv(1024)#接收比特流数据
            #没有接收到比特流数据,则无数据在传输即断开连接
            if not data:
                print("客户已经断开")
                break
            print("执行指令:",data)
            cmd_res = os.popen(data.decode()).read()#把比特流数据转为str,再执行指令,最后读取到内存赋值给变量cmd_res
            print("before send:",len(cmd_res))
            #判断cmd_res是否为 0,popen函数执行失败返回 0
            if len(cmd_res) == 0:
                cmd_res = "cmd has no output..."
            #cmd_res为字符串,.encode()后变为比特流,再用len计算出比特流的大小,再把这个整数转为字符串,最后转为比特流发送出去
            conn.send( str(len(cmd_res.encode())).encode("utf-8") )
            #把指令执行内容编译成比特流发送出去
            conn.send(cmd_res.encode("utf-8"))
            print("send done")
    server.close()

    ftp客户端:

    import socket
    import hashlib
    client = socket.socket()
    client.connect(('localhost',9999))
    while True:
            cmd = input(">>: ").strip()
            if len(cmd) == 0:continue
            if cmd.startswith("get"):
                    client.send(cmd.encode())
                    server_response = client.recv(1024)
                    print("server response: ",server_response)
                    client.send(b"ready to recv file")
                    file_total_size = int(server_response.decode())
                    received_size = 0
                    filename = cmd.split()[1]
                    f = open(filename + ".new","wb")
                    m = hashlib.md5()
    
                    while received_size < file_total_size:
                            if file_total_size - received_size > 1024:
                                    size = 1024
                            else:
                                    size = file_total_size -received_size
                                    print("last received:",size)
    
                            data = client.recv(size)
                            received_size += len(data)
                            m.update(data)
                            f.write(data)
                    else:
                            new_file_md5 = m.hexdigest()
                            print("file recv done",received_size,file_total_size)
                            f.close()
                    server_file_md5 = client.recv(1024)
                    print("server file md5: ",server_file_md5)
                    print("client file md5: ",new_file_md5)
    client.close()

    ftp服务器端:

    import socket,os
    import hashlib
    server = socket.socket()
    server.bind(('0.0.0.0',9999))
    server.listen(5)
    print("等待连接....")
    while True:
            conn,addr = server.accept()
            print("连接成功....")
            while True:
                    print("等待指令")
                    data = conn.recv(1024)
                    if not data:
                            print("客户端已断开")
                            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()
                            conn.send(m.hexdigest().encode())
                    print("文件发送完毕....")
    server.close()


     

    socketserver模块

    实现简单的连接:

    客户端:

    import socket
    client = socket.socket()
    client.connect(('localhost',9999))
    while True:
        cmd = input(">>:").strip()
        if len(cmd) == 0:continue
        client.send(cmd.encode('utf-8'))
        data = client.recv(10240)
        print("从服务器接受到的数据:",data.decode())
    
    client.close()

    服务器端:

    import socketserver
    class MyTCPHandler(socketserver.BaseRequestHandler):
        def handle(self):
            while True:
                try:
                    self.data = self.request.recv(1024).strip()
                    if not self.data:
                        print("客户已断开")
                        break
                    print("{} wrote:".format(self.client_address[0]))
                    print(self.data)
                    self.request.send(self.data.upper())
                except ConnectionResetError as e:
                    print("Error:",e)
                    break
    
    if __name__ == "__main__":
        HOST,PORT = "localhost",9999
        server = socketserver.TCPServer((HOST,PORT),MyTCPHandler)
        server.serve_forever()
  • 相关阅读:
    [页面布局方式]
    padding and margin
    【浏览器中的页面】
    【浏览器的页面循环系统】
    Activity启动模式详解(二)--->singleTask
    finish、onDestory、System.exit的区别
    Androidndk开发打包时我们应该如何注意平台的兼容(x86,arm,arm-v7a)
    关于WifiManager的一些看法
    高效的找出两个List中的不同元素
    关于Activity的生命周期
  • 原文地址:https://www.cnblogs.com/tcheng/p/5877483.html
Copyright © 2011-2022 走看看