1. 程式人生 > >Python入門學習-DAY32-鏈接循環與通信循環,粘包問題,遠程控制,文件上傳與下載

Python入門學習-DAY32-鏈接循環與通信循環,粘包問題,遠程控制,文件上傳與下載

stderr 數據 tor sts pfile int 長度 stdout net

鏈接循環與通信循環

服務端

from socket import *

IP = 127.0.0.1
PORT = 8181
ADDRESS = (IP, PORT)
BUFSIZE = 1024

server = socket(AF_INET, SOCK_STREAM)

server.bind(ADDRESS)

server.listen(5)
tag=True
while tag:
    conn, addr = server.accept()
    while tag:
        try:
            data = conn.recv(BUFSIZE)
            
if not data: print(服務端斷開。。。) break print(>>>>,data.decode(utf-8)) conn.send(收到.encode(utf-8)) except ConnectionResetError: break conn.close() server.close()

客戶端

import  socket
IP=127.0.0.1
PORT=8181
ADDRESS
=(IP,PORT) BUFSIZE=1024 client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(ADDRESS) while True: msg=input(>>>) if len(msg) == 0: continue client.send(msg.encode(utf-8)) data=client.recv(BUFSIZE) print(data.decode(utf-8)) client.close()

遠程控制

服務端

import socket
import subprocess
IP = 192.168.13.126
PORT = 8282
ADDRESS = (IP, PORT)
BUFSIZE = 1024

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.bind(ADDRESS)

server.listen(5)
tag=True
while tag:
    conn, addr = server.accept()
    while tag:
        try:
            data = conn.recv(BUFSIZE)
            if not data:
                print(服務端斷開。。。)
                break
            #獲取sub對象
            res = subprocess.Popen(data.decode("utf-8"),
                                   shell=True,
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE)
            print(>>>>,data.decode(utf-8))
            stdout=res.stdout.read()
            stderr=res.stderr.read()

            conn.send(stdout+stderr)
        except ConnectionResetError:
            break
    conn.close()
server.close()

客戶端

import  socket
IP=127.0.0.1
PORT=8282
ADDRESS=(IP,PORT)
BUFSIZE=1024

client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

client.connect(ADDRESS)
while True:

    msg=input(>>>)
    if len(msg) == 0: continue
    client.send(msg.encode(utf-8))
    data=client.recv(BUFSIZE)

    print(data.decode(gbk))

client.close()

粘包問題

服務端

import socket
import subprocess
import struct
import json

IP = 127.0.0.1
PORT = 8383
ADDRESS = (IP, PORT)
BUFSIZE = 1024

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.bind(ADDRESS)

server.listen(5)
tag = True
while tag:
    conn, addr = server.accept()
    while tag:
        try:
            data = conn.recv(BUFSIZE)
            if not data:
                print(服務端斷開。。。。)
                break
            # 獲取sub對象
            res = subprocess.Popen(data.decode("utf-8"),
                                   shell=True,
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE)
            print(>>>>, data.decode(utf-8))
            # 成功的結果
            stdout = res.stdout.read()
            # 失敗的結果
            stderr = res.stderr.read()

            # 1.制作報頭
            header_dic = {
                filename: a.txt,
                md5: sd7a86d87sad6as,
                total_size: len(stdout) + len(stderr)
            }
            header_json = json.dumps(header_dic)
            header_bytes = header_json.encode(utf-8)

            # 2.先發送報頭長度
            conn.send(struct.pack(i, len(header_bytes)))

            # 3.再發送報頭
            conn.send(header_bytes)

            # 4.最後發送數據
            conn.send(stdout)
            conn.send(stderr)
        except ConnectionResetError:
            break
    conn.close()
server.close()

客戶端

import socket
import struct
import json
IP = 127.0.0.1
PORT = 8383
ADDRESS = (IP, PORT)
BUFSIZE = 1024

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client.connect(ADDRESS)
while True:

    msg = input(>>>)
    if len(msg) == 0: continue
    client.send(msg.encode(utf-8))

    # 1.先獲取報頭長度
    header_size = struct.unpack(i,client.recv(4))[0]

    #2.在獲取報頭
    header_bytes=client.recv(header_size)
    header_json=header_bytes.decode(utf-8)
    header_dic=json.loads(header_json)
    print(header_json)
    total_size=header_dic[total_size]

    # 3.在獲取真正數據
    cmd_res=b‘‘
    recv_size=0
    while recv_size<total_size:
        data=client.recv(1024)
        recv_size+=len(data)
        cmd_res+=data
    print(cmd_res.decode(gbk))

client.close()

文件上傳與下載

common

import json, struct, os


def accept(type, obj):
    res = obj.recv(1).decode(utf-8)
    if res == 1:
        # 1.先獲取報頭長度
        header_size = struct.unpack(i, obj.recv(4))[0]
        # 2.在獲取報頭
        header_bytes = obj.recv(header_size)  # 接受字節型的報頭
        header_json = header_bytes.decode(utf-8)  # 將字節型的報頭轉化為原先的JSON格式
        header_dic = json.loads(header_json)  # 將JSON格式的報頭轉化為原先的字典
        total_size = header_dic[total_size]
        print(header_dic)
        # 3.在獲取真正數據
        recv_size = 0
        # 設置存放文件的路徑
        if type == server:
            file_path = os.path.join(rC:\Users\Administrator\Desktop\服務端文件中心\%s % header_dic[filename])
        elif type == client:
            file_path = os.path.join(rC:\Users\Administrator\Desktop\客戶端文件中心\%s % header_dic[filename])
        # 判斷文件內容是否為空
        if total_size != 0:
            while (recv_size < total_size):
                data = obj.recv(10240)
                recv_size += len(data)
                with open(file_path, wb) as f:
                    f.write(data)
        else:
            f = open(file_path, wb)
            f.close()
        return True
    else:
        return False


def transfer(obj, filename):
    if os.path.exists(filename):
        obj.send(1.encode(utf-8))
        filepath, tempfilename = os.path.split(filename)
        # 1.制作報頭
        header_dic = {
            filename: tempfilename,
            total_size: os.stat(filename).st_size
        }
        header_json = json.dumps(header_dic)#將字典格式序列化為json方便傳送
        header_bytes = header_json.encode(utf-8)#只能傳送bytes類型,所以要轉化為bytes類型
        print(header_dic)
        # 2.先發送報頭長度
        obj.send(struct.pack(i, len(header_bytes)))

        # 3.再發送報頭
        obj.send(header_bytes)

        # 4.最後發送數據
        with open(filename, rb) as f:
            for i in f:
                obj.send(i)
        return True
    else:
        obj.send(0.encode(utf-8))
        return False

服務端

import socket
import common


def run():
    IP = 127.0.0.1
    PORT = 8484
    ADDRESS = (IP, PORT)
    BUFSIZE = 1024
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(ADDRESS)
    server.listen(5)
    tag = True
    while tag:
        conn, addr = server.accept()
        while tag:
            try:
                data = conn.recv(BUFSIZE)
                if not data:
                    print("客戶端已斷開。。。")
                    break
                cmd, filename = data.decode("utf-8").split( )
                print(>>>>, data.decode(utf-8))
                if cmd==1:
                    flag=common.accept(server,conn)
                    if flag:
                        print(接受成功)
                    else:
                        print(接受失敗)
                elif cmd==2:
                    flag=common.transfer(conn, filename)
                    if flag:
                        print(傳送成功)
                    else:
                        print(傳送失敗)
            except ConnectionResetError:
                break
        conn.close()
    server.close()


run()

客戶端

import socket
import common


def run():
    IP = 127.0.0.1
    PORT = 8484
    ADDRESS = (IP, PORT)
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(ADDRESS)
    print(‘‘‘
    1.上傳
    2.下載
            ‘‘‘)
    while True:
        msg = input(>>>(1/2):)
        if len(msg) == 0: continue
        if msg!=1 and msg!=2:
            print(指令錯誤)
            continue
        filename=input(文件地址:)
        client.send((msg+ +filename).encode(utf-8))
        if msg == 1:
            flag=common.transfer(client, filename)
            if flag:
                print(上傳成功)
            else:
                print(上傳失敗)
        elif msg == 2:
            flag=common.accept(client,client)
            if flag:
                print(下載成功)
            else:
                print(下載失敗)

    client.close()



run()

Python入門學習-DAY32-鏈接循環與通信循環,粘包問題,遠程控制,文件上傳與下載