如何使用python从客户端取消屏蔽数据

时间:2016-03-06 13:13:31

标签: python sockets webserver

我正在使用从客户端获取数据的python编写自己的服务器,并且我已经在线阅读客户端在发送到服务器时屏蔽其数据。我已经完成了整个握手的事情,但我还没找到能够解开数据包的代码。我发现了一个声称可以执行此操作的代码但它不适用于我。是否有预先制作的功能或包装?任何帮助将不胜感激。

下面是我的代码:

# -----------------LISTEN FOR INCOMING DATA FUNCTION----------------- #

def listening_for_msgs(conn):
while True:
    try:
        rcv_msg = conn.recv(1024) #conn is the connection to the client
        rcv_msg_str = str(rcv_msg[:].decode("utf-8"))
        rcv_msg_list = rcv_msg_str.split('\r\n')
        if rcv_msg_list[0] == 'GET /echo HTTP/1.1':
            HandshakeThread = startHandshakeThread(rcv_msg_str, conn)
            HandshakeThread.start()
        else:
            print(unmask_data(rcv_msg))
    except UnicodeDecodeError:
        unmask_data(rcv_msg)

# -----------------UNMASKING CLIENTS PACKET FUNCTION----------------- #  

def unmask_data(rcv_msg):
    # as a simple server, we expect to receive:
    #    - all data at one go and one frame
    #    - one frame at a time
    #    - text protocol
    #    - no ping pong messages
data = bytearray(rcv_msg)
if len(data) < 6:
    raise Exception("Error reading data")
# FIN bit must be set to indicate end of frame
assert(0x1 == (0xFF & data[0]) >> 7)
# data must be a text frame
# 0x8 (close connection) is handled with assertion failure
assert(0x1 == (0xF & data[0]))

# assert that data is masked
assert(0x1 == (0xFF & data[1]) >> 7)
datalen = (0x7F & data[1])

# print("received data len %d" %(datalen,))

str_data = ''
if datalen > 0:
    mask_key = data[2:6]
    masked_data = data[6:(6 + datalen)]
    unmasked_data = [masked_data[i] ^ mask_key[i % 4] for i in     range(len(masked_data))]
    str_data = str(bytearray(unmasked_data))
return str_data

1 个答案:

答案 0 :(得分:0)

  

我正在编写自己的服务器,使用python从客户端获取数据,我在线阅读客户端在发送到服务器时屏蔽其数据。

我建议您再次阅读并使用其他资源。您正在将您的代码构思与来自WebSocket连接的常规Web请求混合在一起。屏蔽仅与WebSocket连接相关。描述WebSockets掩码如何工作,如何从Web请求建立WebSocket连接以及为什么WebSockets与普通套接字等不同,这个问题过于宽泛。如果您想快速获得结果,请使用existing libraries。如果您想了解所有这些如何编写自己的代码,请阅读specification for WebSockets或研究现有库的源代码。