Guest User

Untitled

a guest
Jul 21st, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.64 KB | None | 0 0
  1. import json, socket, threading, time
  2.  
  3. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  4. server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  5. server_socket.bind(("0.0.0.0", 9876))
  6. server_socket.listen(128)
  7.  
  8. def handler(socket, address):
  9. """
  10. Description:
  11. Handle a WebSocket request. Parse the incoming request header and return a
  12. """
  13. print "Received connection from %s:%d" % (address[0], address[1])
  14.  
  15. try:
  16. # Build HTTP Response Header and Send It
  17. data = read_until(socket, "\r\n\r\n")
  18. response = parse_request(data)
  19. socket.send(response)
  20.  
  21. # Loop and keep socket open
  22. while True:
  23. data = read_until(socket, "\xFF").strip("\x00\xFF")
  24. try:
  25. req = json.loads(data)
  26. except:
  27. socket.send("\x00%s\xFF" % json.dumps({"error_msg": "Invalid JSON syntax sent"}))
  28.  
  29. if req['task'] == "GetDateTime":
  30. socket.send("\x00%s\xFF" % json.dumps({"date_time": time.strftime('%X %x %Z')}))
  31. else:
  32. socket.send("\x00%s\xFF" % json.dumps({"error_msg": "Unknown task request"}))
  33.  
  34. except Exception,e:
  35. # The dishes are done!
  36. print e
  37. socket.close()
  38.  
  39. def time_update(socket, address):
  40. try:
  41. # Loop and keep socket open
  42. while True:
  43. socket.send("\x00%s\xFF" % json.dumps({"date_time": time.strftime('%X %x %Z')}))
  44. time.sleep(5)
  45.  
  46. # The dishes are done!
  47. socket.close()
  48.  
  49. except Exception,e:
  50. # The dishes are done!
  51. socket.close()
  52.  
  53. def parse_request (request):
  54. """
  55. Description:
  56. Parse the incoming request header and return a response header.
  57.  
  58. Param:
  59. (String) request: The request header from the client.
  60.  
  61. Return:
  62. (String) Response header.
  63. """
  64.  
  65. request_details = {}
  66.  
  67. # Parse incoming request
  68. for line in request.split("\r\n"):
  69. try:
  70. field, value = line.split(": ",1)
  71. if field in ["Host","Origin"] and value:
  72. request_details[field] = value
  73. except:
  74. pass
  75.  
  76. # Build response header
  77. response_header = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" +\
  78. "Upgrade: WebSocket\r\n" +\
  79. "Connection: Upgrade\r\n" +\
  80. "WebSocket-Origin: %s\r\n" % request_details['Origin'] +\
  81. "WebSocket-Location: ws://%s/\r\n" % request_details['Host'] +\
  82. "WebSocket-Protocol: sample"
  83. response_header = response_header.strip() + '\r\n\r\n'
  84. return response_header
  85.  
  86. def read_until (socket, delimiter):
  87. """
  88. Description:
  89. Read from socket until a delimter is met.
  90.  
  91. Params:
  92. (Socket) socket
  93. (String) delimter
  94.  
  95. Return:
  96. (String)
  97. """
  98.  
  99. data = ""
  100.  
  101. while True:
  102. byte = socket.recv(4096)
  103.  
  104. if len(byte) == 0:
  105. # client left us :<
  106. raise Exception("Client closed connection")
  107.  
  108. data += byte
  109.  
  110. if data.find(delimiter) > -1:
  111. # found what we were lookin' for, yo!
  112. return data.rstrip()
  113.  
  114. # Start Taking Connections
  115. while True:
  116. client_socket, address = server_socket.accept()
  117. threading.Thread(target = handler, args = (client_socket, address)).start()
  118. time.sleep(3)
  119. # This is just for testing sending data to the client even when it is not requesting data
  120. threading.Thread(target = time_update, args = (client_socket, address)).start()
Add Comment
Please, Sign In to add comment