簡體   English   中英

Python 3:通過套接字發送文件。 (客戶端 - 服務器程序)

[英]Python 3: Sending files through socket. (Client-Server Program)

我有上述問題。 客戶端假設要求輸入文件名並將文件名發送到服務器,之后服務器將打開文件並顯示它。 問題是服務器沒有打開文件並顯示它。

以下是客戶。

#!/usr/bin/env python3 
import socket, os.path, datetime, sys

def Main():
    host = '127.0.0.1'
    port = 50001

    s = socket.socket()
    s.connect((host, port))

    Filename = input("Type in ur file ")
    s.send(Filename.encode('utf-8'))
    data = s.recv(1024).decode('utf-8')
    s.close()

if __name__ == '__main__':
    Main()

下面是服務器

#!/usr/bin/env python3

import socket
import os
import sys



def Main():
    host = '127.0.0.1'
    port = 50001

    s = socket.socket()
    s.bind((host,port))
    print("server Started")
    s.listen(1)
    c, addr = s.accept()
    print("Connection from: " + str(addr))
    while True:
        data = c.recv(1024).decode('utf-8')
        myfile = open(data, "r")
        if not data:
            break
        print("from connected user: " + myfile)

    c.close()

if __name__ == '__main__':
    Main()

我對運行的代碼進行了一些最小的調整,以便server.py持續偵聽給定端口並發送每次調用client.py請求的數據。

server.py

#!/usr/bin/env python3
import socket
import os
import sys

def Main():
    host = '127.0.0.1'
    port = 50001

    s = socket.socket()
    s.bind((host,port))
    print("server Started")
    s.listen(1)
    while True:
        c, addr = s.accept()
        print("Connection from: " + str(addr))
        filename = ''
        while True:
            data = c.recv(1024).decode('utf-8')
            if not data:
                break
            filename += data
        print("from connected user: " + filename)
        myfile = open(filename, "rb")
        c.send(myfile.read())
        c.close()

if __name__ == '__main__':
    Main()

client.py

#!/usr/bin/env python3 
import socket, os.path, datetime, sys

def Main():
    host = '127.0.0.1'
    port = 50001

    s = socket.socket()
    s.connect((host, port))

    Filename = input("Type in ur file ")
    s.send(Filename.encode('utf-8'))
    s.shutdown(socket.SHUT_WR)
    data = s.recv(1024).decode('utf-8')
    print(data)
    s.close()

if __name__ == '__main__':
    Main()

現在有點解釋。

在服務器端。 外部循環接受連接,然后從連接讀取直到完成(稍后將詳細介紹)。 打印您的調試信息,但請注意您嘗試print文件對象而不是文件名(這將嘗試連接失敗)。 我也以二進制模式打開文件(這樣我可以跳過str - > bytes翻譯。

在客戶端。 我已經添加了在發送文件時關閉套接字的寫入端。 請注意,對於此用例,您可能希望使用sendall而不是send :請查看這些文檔鏈接以獲取詳細信息。 我已經為傳入的數據添加了一個print

現在關閉客戶端的寫入結束和內部循環讀取(也與sendall提示相關。對於服務器端哪個BTW也適用,否則你應該循環,因為你可能會看到你的內容被截斷;其他選項也是一個發送循環。)。 流套接字將保證您將字節輸入以便發送它們。 它本身並不知道你的消息是否完整,也不能保證數據的發送和接收數量和數量(相應)。

服務器的內部循環繼續讀取,直到我們看到EOF (我們在python socket收到零長度字符串)。 這會發生(當遠程套接字(或至少它的寫入端)被關閉時由recv返回。由於我們仍然想重用連接,我們只在客戶端的發送端執行此操作。希望這可以幫助您繼續前進

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM