title: Tcp sockets to send and receive files, using python
body: <p>I am trying to make simple client server program to send and receive file form server using tcp sockets. As far as getting files from server is not an issue, server creates a file with the same name and put data in that file but when it comes to putting files to server,sometimes it works great but always chance so mostly server is getting file name along with file contents and instead of writing that to file, it writes both filename and contents as new file name and that file remains empty. Will be great help if someone can suggest any solution.</p>
  
  <p><strong>server.py</strong></p>
  
  <pre><code>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&gt; %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()
  </code></pre>
  
  <p><strong>client.py</strong></p>
  
  <pre><code>    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&gt; ' % 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.
  </code></pre>