全部产品
云市场

4.3 WebSocket

更新时间:2019-09-18 15:40:01

WebSocket 是一种标准协议,用于在客户端和服务端之间进行双向数据传输。但它跟 HTTP 没什么关系,它是基于 TCP 的一种独立实现。

  1. #启动Socket并监听连接
  2. sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

Parameters/参数说明

参数名称 参数类型 参数说明

Return Value/返回信息

  1. 暂无

Remarks/备注

  1. 暂无

  1. 暂无

Example/实例

Example WebSocket

  1. def Create_Socket():
  2. #启动Socket并监听连接
  3. sock=socket.socket(socket.AF_INFT,socket.SOCK_STREAM)
  4. try:
  5. sock.bind('127.0.0.1',8001)
  6. #操作系统会在服务器Socket 被关闭或服务器进程终止后马上释放该服务器端口
  7. sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  8. sock.listen(5)
  9. except Exception as e:
  10. logging.error(e)
  11. return
  12. else:
  13. loging.info('Server running...')
  14. #等待访问
  15. while True:
  16. conn , addr = sock.accept() #进入waiting 状态
  17. data=str(conn.recv(1024))
  18. logging.debug(data)
  19. header_dict={}
  20. header, _ =data.split(r'\r\n\r\n',1)
  21. for line in header.split(r'\r\n')[1:]:
  22. key , val = line.split(':',1)
  23. header_dict[key]=val
  24. if 'Sec-WebSocket-Key' not in header_dict:
  25. logging.error('This socket is not websocket,client close.')
  26. conn.close()
  27. return
  28. magic_ket=''
  29. sec_key=header_dict['Sec-WebSocket-Key']+magic_ket
  30. key=base64.b64encode(hashlib.shal(bytes(sec_key,encodeing='utf-8')).digest())
  31. logging.debug(key_str)
  32. response=''
  33. conn.send(bytes(response,encoding='utf-8'))
  34. WebSocketThread(conn).start()
  35. pass
  36. def read_msg(data):
  37. mes_len=data[1]&127 # 数据载荷长度
  38. if msg_len==126:
  39. mask =data[4:8] #mask掩码
  40. content =data[8:] #消息内容
  41. elif msg_len==127:
  42. mask =data[10:14]
  43. content =data[14:]
  44. else:
  45. mask=data[2:6]
  46. content=data[6:]
  47. raw_str= '' #解码后的内容
  48. for i,d in enumerate(content):
  49. raw_str+=chr(d ^ mask[i%4])
  50. return raw_str
  51. pass
  52. def write_msg(message):
  53. data = struct.pack('B',129)
  54. # 写入包长度
  55. msg_len=len(message)
  56. if msg_len<=125:
  57. data+=stryct.pack('B',msg_len)
  58. elif msg_len <= (2 ** 16-1):
  59. data += struct.pack('!BH',126,meg_len)
  60. elif msg_len <= (2 ** 64-1):
  61. data += struct.pack('!BQ',126,meg_len)
  62. else:
  63. return
  64. data += bytes(message,encoding='utf-8')
  65. return data
  66. pass