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

时间:2017-10-17 12:34:37

标签: python python-2.7 sockets tcp tcpsocket

我正在尝试使用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.

1 个答案:

答案 0 :(得分:0)

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

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

可以收到:

s.recv(1024)
# 'put filenamedata'

接收缓冲区数据并仅提取完整消息。一种方法是在消息之前发送消息的大小。