Tcp 套接字发送和接收文件,使用python

Tcp sockets to send and receive files, using python

我正在尝试制作简单的客户端服务器程序来使用 tcp 套接字从服务器发送和接收文件。至于从服务器获取文件不是问题,服务器创建一个具有相同名称的文件并将数据放入该文件但是当涉及到将文件放入服务器时,有时它工作得很好但总是有机会所以大多数服务器正在获取文件名连同文件内容,而不是将其写入文件,而是将文件名和内容都写为新文件名,并且该文件保持为空。如果有人可以提出任何解决方案,将会有很大的帮助。

server.py

import socket
import sys
HOST = 'localhost'
PORT = 3820

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind((HOST, PORT))

socket.listen(1)
while (1):
    conn, addr = socket.accept()
    print 'New client connected ..'
    reqCommand = conn.recv(1024)
    print 'Client> %s' %(reqCommand)
    if (reqCommand == 'quit'):
        break
    #elif (reqCommand == lls):
        #list file in server directory
    else:
        string = reqCommand.split(' ', 1)   #in case of 'put' and 'get' method
        reqFile = string[1]

        if (string[0] == 'put'):
            with open(reqFile, 'wb') as file_to_write:
                data=conn.recv(1024)
                while True:
                    if not data:
                        break
                    else:
                        file_to_write.write(data)
                        data=conn.recv(1024)
                    file_to_write.close()
                    break
            print 'Receive Successful'
        elif (string[0] == 'get'):
            with open(reqFile, 'rb') as file_to_send:
                for data in file_to_send:
                    conn.sendall(data)
            print 'Send Successful'
    conn.close()

socket.close()

client.py

    import socket
import sys

HOST = 'localhost'    # server name goes in here
PORT = 3820


def put(commandName):
    socket1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket1.connect((HOST, PORT))
    socket1.send(commandName)
    string = commandName.split(' ', 1)
    inputFile = string[1]
    with open('clientfolder/'+inputFile, 'rb') as file_to_send:
        data=file_to_send.read(1024)
        while(data):
            socket1.send(data)
            data=file_to_send.read(1024)
            file_to_send.close()
    print 'PUT Successful'
    socket1.close()
    return


def get(commandName):
    socket1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket1.connect((HOST, PORT))
    socket1.send(commandName)
    string = commandName.split(' ', 1)
    inputFile = string[1]
    with open('clientfolder/'+inputFile, 'wb') as file_to_write:
        while True:
            data = socket1.recv(1024)
            # print data
            if not data:
                break
            # print data
            file_to_write.write(data)
    file_to_write.close()
    print 'GET Successful'
    socket1.close()
    return


msg = raw_input('Enter your name: ')
while(1):
    print 'Instruction'
    print '"put [filename]" to send the file the server '
    print '"get [filename]" to download the file from the server '
    print '"ls" to list all files in this directory'
    print '"lls" to list all files in the server'
    print '"quit" to exit'
    sys.stdout.write('%s> ' % msg)
    inputCommand = sys.stdin.readline().strip()
    if (inputCommand == 'quit'):
        socket.send('quit')
        break
    # elif (inputCommand == 'ls')
    # elif (inputCommand == 'lls')
    else:
        string = inputCommand.split(' ', 1)
        if (string[0] == 'put'):
            put(inputCommand)
        elif (string[0] == 'get'):
            get(inputCommand)
#current working directory is server location
#get will get file from current directory to clientfolder directory.

TCP 是一种流式传输协议,因此您必须在协议中设计消息中断。例如:

s.send('put filename')
s.send('data')

可以接收为:

s.recv(1024)
# 'put filenamedata'

因此缓冲接收到的数据并且只提取完整的消息。一种方法是在消息之前发送消息的大小。