title: Send/receive Packets with TCP sockets
body: <p>Recently, I managed to create sockets on my PC and my Raspberry Pi to enable communication between both devices. Currently, the client is able to automatically send messages to the server. I was wondering, if it is possible to modify the scripts to send tcp data packets instead of purely text messages, as I would very much like to control the raspberry pi using my PC in the future without having the need to ssh/etc. </p>
  
  <p>I've looked at some examples, but as I don't have much experience in writing my own scripts/codes, I'm not very sure how to go about doing this. I would appreciate if someone could guide me in the right direction with explanation and some examples if possible.</p>
  
  <p>Anyway here is the server/client script I'm running at the moment:</p>
  
  <p>Client:</p>
  
  <pre><code>import socket   
  import sys  
  import struct
  import time
  
  #main function
  if __name__ == "__main__":
  
      if(len(sys.argv) &lt; 2) :
          print 'Usage : python client.py hostname'
          sys.exit()
  
      host = sys.argv[1]
      port = 8888
  
  #create an INET, STREAMing socket
  try:
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  except socket.error:
      print 'Failed to create socket'
      sys.exit()
  
  print 'Socket Created'
  
  try:
      remote_ip = socket.gethostbyname( host )
      s.connect((host, port))
  
  except socket.gaierror:
      print 'Hostname could not be resolved. Exiting'
      sys.exit()
  
  print 'Socket Connected to ' + host + ' on ip ' + remote_ip
  
  #Send some data to remote server
  message = "Test"
  
  try :
      #Set the whole string
      while True:
          s.send(message)
          print 'Message sent successfully'
          time.sleep(1)
          print 'Sending...'
  except socket.error:
      #Send failed
      print 'Send failed'
      sys.exit()
  
  def recv_timeout(the_socket,timeout=2):
      #make socket non blocking
      the_socket.setblocking(0)
  
      #total data partwise in an array
      total_data=[];
      data='';
  
      #beginning time
      begin=time.time()
      while 1:
          #if you got some data, then break after timeout
          if total_data and time.time()-begin &gt; timeout:
              break
  
          #if you got no data at all, wait a little longer, twice the timeout
          elif time.time()-begin &gt; timeout*2:
              break
  
          #recv something
          try:
              data = the_socket.recv(8192)
              if data:
                  total_data.append(data)
                  #change the beginning time for measurement
                  begin=time.time()
              else:
                  #sleep for sometime to indicate a gap
                  time.sleep(0.1)
          except:
              pass
  
      #join all parts to make final string
      return ''.join(total_data)
  
  #get reply and print
  print recv_timeout(s)
  
  s.close()
  </code></pre>
  
  <p>Server:</p>
  
  <pre><code>import socket
  import sys
  from thread import *
  
  HOST = ''   # Symbolic name meaning all available interfaces
  PORT = 8888
  
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  print 'Socket created'
  
  try:
      s.bind((HOST, PORT))
  except socket.error , msg:
      print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
      sys.exit()
  
  print 'Socket bind complete'
  
  s.listen(10)
  print 'Socket now listening'
  
  #Function for handling connections
  def clientthread(conn):
      #Sending message to connected client
      conn.send('Welcome to the server. Receving Data...\n') #send only takes string
  
      #infinite loop so that function do not terminate and thread do not end.
      while True:
  
          #Receiving from client
          data = conn.recv(1024)
          reply = 'Message Received at the server!\n'
          print data
          if not data:
              break
  
          conn.sendall(reply)
  
      conn.close()
  
  #now keep talking with the client
  while 1:
      #wait to accept a connection
      conn, addr = s.accept()
      print 'Connected with ' + addr[0] + ':' + str(addr[1])
  
      #start new thread
      start_new_thread(clientthread ,(conn,))
  
  s.close()
  </code></pre>