Python客户端服务器传输.txt文件不写入

0 投票
1 回答
5318 浏览
提问于 2025-04-18 17:03

我正在尝试用Python写一个简单的客户端/服务器程序,使用TCP套接字,但我搞不清楚为什么文件没有传输成功。

客户端:

    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文件中。尽管我在代码里有一个结束语句,但程序似乎无法正常结束。任何帮助都会非常有用。谢谢!

1 个回答

1

你在循环里面调用了 accept。这样的话,你只有一个 recv 的调用来接收数据,所以 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()

撰写回答