Python 3:通过套接字发送文件。 (客户端 - 服务器程序)

问题描述 投票:3回答:1

我有上述问题。客户端假设要求输入文件名并将文件名发送到服务器,之后服务器将打开文件并显示它。问题是服务器没有打开文件并显示它。

以下是客户。

#!/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()
python python-3.x sockets
1个回答
2
投票

我对你运行的代码进行了一些最小的调整,以便server.py持续监听给定的端口并发回每次client.py调用请求的数据。

server.朋友

#!/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.朋友

#!/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返回。由于我们仍然想重用连接,我们只在客户端的发送端执行此操作。希望这可以帮助您继续前进

© www.soinside.com 2019 - 2024. All rights reserved.