1. 程式人生 > >python 3.x 學習筆記13 (socket_ssh and socket_文件傳輸)

python 3.x 學習筆記13 (socket_ssh and socket_文件傳輸)

粘包問題 問題 取出 nec imp 傳輸文件 ket color md5

ssh服務端

import socket,os

server = socket.socket()
server.bind((localhost,6666))

server.listen()
conn, addr = server.accept()
while True:
    print(等待新數據!)
    cmd = conn.recv(1024)
    
    if len(cmd) == 0:
        break
        
    data = os.popen(cmd.decode()).read()
    cmd_size = len(data.encode(
utf-8)) print(檢測到數據大小,cmd_size) if len(data) == 0: data = 沒有此命令!! conn.send(str(len(data.encode(utf-8))).encode()) order = conn.recv(1024) conn.send(data.encode(utf-8)) print(傳送完成!) server.close()

ssh客戶端

import socket

client = socket.socket()
client.connect((
localhost,6666)) while True: cmd = input(>>>:) if cmd == 0: continue client.send(cmd.encode(utf-8)) cmd_size = client.recv(1024) print(服務端檢測到數據大小:, cmd_size) if len(cmd_size) !=0: client.send(可以發送數據了.encode(encoding=utf-8)) receive_size
= 0 receive_cmd = b‘‘ while receive_size < int(cmd_size.decode()): data = client.recv(1024) receive_size += len(data) receive_cmd += data else: print(接收到數據大小:,receive_size) print(數據接收完成!) print(receive_cmd.decode())

socket文件傳輸並校驗

服務端

import socket,os,hashlib

server = socket.socket()
server.bind((localhost,6666))
server.listen()
conn, addr = server.accept()
while True:
    print(等待新數據!)
    cmd = conn.recv(1024)
    if len(cmd) == 0:
        break
    filename = cmd.decode().split()[1]
    print(filename)
    if os.path.isfile(filename):          #判斷文件是否存在
        f = open(filename,rb)           #打開文件
        m = hashlib.md5()
        file_size = os.stat(filename).st_size   #查詢文件大小
        print(file_size)
        conn.send(str(file_size).encode())         #給客戶端發送文件大小
        conn.recv(1024)                              #等待並接受客戶端的確認,這一步可以解決粘包問題
        for line in f:                              #邊讀邊循環發送文件
            m.update(line)                           #得出每一句的md5值
            conn.send(line)                           #發送給客戶端
        print(file md5:,m.hexdigest())
        f.close()
        conn.recv(1024)
        conn.send(m.hexdigest().encode())

    print(傳送完成!)

server.close()

socket文件傳輸並校驗

客戶端

import socket,hashlib

client = socket.socket()
client.connect((localhost,6666))
while True:
    cmd = input(>>>:).strip()
    if len(cmd) == 0:
        continue
    if cmd.startswith(get):          #傳輸文件名要以get開頭如:get var
        client.send(cmd.encode(utf-8))
        file_size = client.recv(1024)
        print(服務端檢測到文件大小:, int(file_size))
        client.send(可以發送數據了.encode(encoding=utf-8))
        file_total_size = int(file_size)
        receive_size = 0
        filename = cmd.split()[1]         #以空格分割然後取出文件名
        f = open(new_+filename ,wb)
        m = hashlib.md5()
        while receive_size < file_total_size:
            data = client.recv(1024)
            m.update(data)
            receive_size += len(data)
            f.write(data)
            print(file_total_size, receive_size)
        else:
            new_file_md5 = m.hexdigest()
            print(數據接收完成!)
            f.close()
            client.send(可以發送md5值了.encode())
        serve_md5 = client.recv(1024)
        print(新文件md5:,new_file_md5)
        print(原文件md5:,serve_md5)

client.close()

python 3.x 學習筆記13 (socket_ssh and socket_文件傳輸)