Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import json, socket, threading, time
- server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- server_socket.bind(("0.0.0.0", 9876))
- server_socket.listen(128)
- def handler(socket, address):
- """
- Description:
- Handle a WebSocket request. Parse the incoming request header and return a
- """
- print "Received connection from %s:%d" % (address[0], address[1])
- try:
- # Build HTTP Response Header and Send It
- data = read_until(socket, "\r\n\r\n")
- response = parse_request(data)
- socket.send(response)
- # Loop and keep socket open
- while True:
- data = read_until(socket, "\xFF").strip("\x00\xFF")
- try:
- req = json.loads(data)
- except:
- socket.send("\x00%s\xFF" % json.dumps({"error_msg": "Invalid JSON syntax sent"}))
- if req['task'] == "GetDateTime":
- socket.send("\x00%s\xFF" % json.dumps({"date_time": time.strftime('%X %x %Z')}))
- else:
- socket.send("\x00%s\xFF" % json.dumps({"error_msg": "Unknown task request"}))
- except Exception,e:
- # The dishes are done!
- print e
- socket.close()
- def time_update(socket, address):
- try:
- # Loop and keep socket open
- while True:
- socket.send("\x00%s\xFF" % json.dumps({"date_time": time.strftime('%X %x %Z')}))
- time.sleep(5)
- # The dishes are done!
- socket.close()
- except Exception,e:
- # The dishes are done!
- socket.close()
- def parse_request (request):
- """
- Description:
- Parse the incoming request header and return a response header.
- Param:
- (String) request: The request header from the client.
- Return:
- (String) Response header.
- """
- request_details = {}
- # Parse incoming request
- for line in request.split("\r\n"):
- try:
- field, value = line.split(": ",1)
- if field in ["Host","Origin"] and value:
- request_details[field] = value
- except:
- pass
- # Build response header
- response_header = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" +\
- "Upgrade: WebSocket\r\n" +\
- "Connection: Upgrade\r\n" +\
- "WebSocket-Origin: %s\r\n" % request_details['Origin'] +\
- "WebSocket-Location: ws://%s/\r\n" % request_details['Host'] +\
- "WebSocket-Protocol: sample"
- response_header = response_header.strip() + '\r\n\r\n'
- return response_header
- def read_until (socket, delimiter):
- """
- Description:
- Read from socket until a delimter is met.
- Params:
- (Socket) socket
- (String) delimter
- Return:
- (String)
- """
- data = ""
- while True:
- byte = socket.recv(4096)
- if len(byte) == 0:
- # client left us :<
- raise Exception("Client closed connection")
- data += byte
- if data.find(delimiter) > -1:
- # found what we were lookin' for, yo!
- return data.rstrip()
- # Start Taking Connections
- while True:
- client_socket, address = server_socket.accept()
- threading.Thread(target = handler, args = (client_socket, address)).start()
- time.sleep(3)
- # This is just for testing sending data to the client even when it is not requesting data
- threading.Thread(target = time_update, args = (client_socket, address)).start()
Add Comment
Please, Sign In to add comment