【问题标题】:Python Client Server Transfer .txt Not Writing to FilePython客户端服务器传输.txt不写入文件
【发布时间】:2014-10-06 01:00:54
【问题描述】:

我正在尝试使用 TCP 套接字在 Python 中编写一个简单的客户端/服务器,但我似乎无法弄清楚为什么文件没有传输。

客户:

    import socket

    HOST = ''    #server name goes in here
    PORT = 3820             
    socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket.connect((HOST,PORT))

    fileToSend = open('myUpload.txt', 'rb')
    while True:
        data = fileToSend.readline()
        if data:
            socket.send(data)
        else:
            break
    fileToSend.close()
    print 'end'
    socket.close()
    exit()

打印结束只是告诉我这个客户端完成了。

服务器:

    import socket
    HOST = ''                 
    PORT = 3820
    socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket.bind((HOST, PORT))
    socket.listen(1)

    file = open('myTransfer.txt', 'wb')
    while True:
        conn, addr = socket.accept()
        data = conn.recv(1024)
        print data
        if data:
            file.write(data)
        else:
            file.close()
            break
    socket.close()

    exit()

服务器能够打印出客户端发送的正确数据,但无法将其保存到 myTransfer.txt。即使我在那里有一个 break 语句,该程序似乎也无法终止。任何帮助都会非常有帮助。谢谢!

【问题讨论】:

  • 老样子,老样子。服务器不知道文件何时结束。它将永远等待。您需要先发送文件的大小,然后在服务器中使用该信息来准确接收该字节数。见code.activestate.com/recipes/…
  • @BCartolo:文件结束,连接关闭。

标签: python sockets tcp client file-transfer


【解决方案1】:

您在 while 循环中调用 accept。所以你只有一个recv-call 来接收数据,所以break 永远不会被调用。

顺便说一句。您应该使用sendall,它保证所有数据都已发送。

客户:

import socket

HOST = ''    #server name goes in here
PORT = 3820             
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.connect((HOST,PORT))
with open('myUpload.txt', 'rb') as file_to_send:
    for data in file_to_send:
        socket.sendall(data)
print 'end'
socket.close()

服务器:

import socket
HOST = ''                 
PORT = 3820
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind((HOST, PORT))
socket.listen(1)
conn, addr = socket.accept()
with open('myTransfer.txt', 'wb') as file_to_write:
    while True:
        data = conn.recv(1024)
        print data
        if not data:
            break
        file_to_write.write(data)
socket.close()

【讨论】:

  • 谢谢!那个接受就是问题所在。它不是在写文件,但如果我输入一个多行的文件说:你好,世界它只会传输你好。我用你的代码和我的固定代码都试过了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多