2017-10-17 16 views
0

tcp 소켓을 사용하여 파일 형식 서버를 보내고받는 간단한 클라이언트 서버 프로그램을 만들려고합니다. 서버에서 파일을 가져 오는 것이 문제가되지 않는다면 서버는 같은 이름의 파일을 만들고 그 파일에 데이터를 넣습니다. 그러나 서버에 파일을 올리는 경우 가끔은 잘 작동하지만 항상 서버에서 파일 이름을 가져옵니다. 파일 내용과 함께 파일에 쓰는 대신 파일 이름과 내용을 새 파일 이름으로 쓰고 파일은 비어 있습니다. 누군가가 어떤 해결책을 제안 할 수 있다면 큰 도움이 될 것입니다. 당신이 메시지가 당신의 프로토콜에 침입 설계 할 수 있도록파이썬을 사용하여 파일을주고받는 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. 

답변

0

TCP는 스트리밍 프로토콜입니다. 예를 들어 :

s.recv(1024) 
# 'put filenamedata' 

그래서 데이터가 수신 버퍼 만 전체 메시지를 추출 :

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

는 다음과 같이 수신 할 수 있습니다. 한 가지 방법은 메시지 앞에 메시지 크기를 보내는 것입니다.

+0

먼저 파일 이름을 보내려고했지만 문제를 해결하는 대신 파일 이름이 복제 중입니다. –