Python 3 : Sending files through socket.(客户端-服务器程序)

标签 python python-3.x sockets

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

下面是客户端。

#!/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()

客户端.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()

现在稍微解释一下。

在服务器端。外部循环接受一个连接,然后从连接中读取直到完成(稍后会详细介绍)。打印您的调试信息,但请注意您正在尝试打印 文件对象而不是文件名(这将无法尝试连接)。我还以二进制模式打开文件(这样我就可以跳过 str -> bytes 翻译。

在客户端。我添加了在文件发送后关闭套接字的写入端。请注意,您可能想使用 sendall而不是 send对于此用例:查看这些文档链接以获取详细信息。我还为传入数据添加了 print

现在关闭客户端的写入端和内部循环读取(也与 sendall 提示相关。顺便说一句,服务器端也适用,否则你应该循环,因为您可能会看到您的内容被截断;另一种选择是也有一个发送循环。)。流套接字将保证您按照发送字节的顺序获取字节。它本身并不知道您的消息是否完整,也不保证发送和接收数据的数量和大小。

服务器的内部循环继续读取,直到我们看到 EOF(我们在 python socket 中收到了零长度字符串)。当远程套接字(或至少它的写入端)已关闭时,这会发生(由 recv 返回)。由于我们仍然想重用连接,我们只在发送端执行此操作客户。希望这可以帮助您继续前进。

关于Python 3 : Sending files through socket.(客户端-服务器程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51512621/

相关文章:

android - 我可以通过 native java.net.Socket 连接 Android 客户端与使用 socket.io 的 Node js 服务器吗?

c++ - 将 int 类型的结构放入 Big Endian 中的 ostream 以转换为 char *

python - 使用图像名称 docker-py 运行 docker 容器

python - 将 C 代码转换为 Web Assembly 时出错

python - Beautifulsoup 发现没有值的标签和属性?

python-3.x - 如果文件不存在,则创建一个数据框

python - 连接到套接字的 Python 线程的理想 stack_size 是多少?

python - 模块未找到错误: No module named 'torch'

python - 计算菱形图案中星星的数量

django - 如何使用 jinja 通过 Django 中的 View 从 postgres 获取前 "N"元素