python.problems上的websocket服务器



我面临的任务是为Python实现一个支持websocket的简单服务器句柄。我当然知道龙卷风,但问题在于它的处理方式。连接和握手(交换私钥)的步骤,我做到了,但后来我遇到了问题。1) 来自客户端(浏览器)的消息确实来了,但它们进行了编码。我找到了关于它的信息,但不知道如何解码。文档中说,消息隐藏在掩码下(据我所知,这是一个XOR),但打开这个掩码的密钥没有被客户端(浏览器)拒绝,或者我看不到它。2) 发送服务器、客户端(浏览器)的消息被忽略。根据文件发送

conn.send(bytes(0x00))
conn.send(u'test'.encode('utf-8'))
conn.send(bytes(0xFF))

已在此处上传源代码我在这里发布来源

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import socket,sys,hashlib,time
from base64 import b64encode
from threading import Thread
#===================================
bindto=['127.3.1.4',80]
thr_kill=False
def getsett(text,ss,si,es):
#this function i'm use for cut strings by known patterns
   global getsett_i1,getsett_i2
   if text==None: return None
   if ss==None: return None
   if es==None: return None
   text1=text.lower()
   ss=ss.lower()
   es=es.lower()
   if ss!='': getsett_i1=text1.find(ss,si)
   else: getsett_i1=si
   if getsett_i1==-1: return None
   if es!='': getsett_i2=text1.find(es,getsett_i1+len(ss))
   else: getsett_i2=len(text1)
   if getsett_i2==-1: return None
   return text[getsett_i1+len(ss):getsett_i2]
def thr_waitclient():
   global bindto,thr_kill
   serv=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
   serv.bind((bindto[0],bindto[1]))
   while thr_kill==False:
      serv.listen(1)
      conn,adr=serv.accept()
      data=conn.recv(4096)
      print data
#checking connection type
      if getsett(data,'connection: ',0,"rn").lower()=='upgrade' and getsett(data,'upgrade: ',0,"rn").lower()=='websocket':
#handshake
         wbs=getsett(data,'Sec-WebSocket-Key: ',0,"rn")
         conn.send("HTTP/1.1 101 Web Socket Protocol HandshakernUpgrade: WebSocketrnConnection: UpgradernSec-WebSocket-Accept: "+b64encode(hashlib.sha1(wbs+'258EAFA5-E914-47DA-95CA-C5AB0DC85B11').digest())+"rnSec-WebSocket-Origin: *rnAccess-Control-Allow-Origin: *rnOrigin: *rnAccess-Control-Allow-Credentials:truernAccess-Control-Allow-Headers:content-typernrn")
#wait for clien's messahe,then send response
         while True:
            print conn.recv(4096) #first problem:message is coded
            conn.send(bytes(0x00))
            conn.send(u'test'.encode('utf-8'))
            conn.send(bytes(0xFF))
            #second problem: client ignore message
            time.sleep(0.5)
      else:
         conn.close()
   serv.close()
Thread(None,thr_waitclient).start()
while thr_kill!=True:
   time.sleep(0.3)
sys.exit(0)

WebSocket协议有两种不同的主要变体。您的示例代码是两者的混合体,对任何一种协议都不起作用。

Chrome、Firefox和IE10的最新版本使用了更新的HyBi/IETF协议。旧版本的Chrome和当前版本的Safari(桌面和移动)使用旧的Hixie协议。

Hixie协议使用"\x00"表示帧的开始,使用"\xxf"表示帧结束。Hixie协议没有屏蔽浏览器到服务器的数据。Hixie协议有两个主要版本:75和76。版本76具有附加的数据段,该数据段正好在报头之后但在正常帧之前交换。

较新的HyBi/IETF协议使用2-10字节的报头,该报头包含有效载荷长度并且没有单独的结束标记。在较新的协议中,从浏览器到服务器的有效负载数据使用4字节运行XOR掩码进行掩码。头之后的前4个字节是浏览器到服务器情况下的掩码。服务器到浏览器的数据没有屏蔽。HyBi协议的握手头和过程也不同。

许多WebSocket服务器同时支持WebSocket协议的Hixie和HyBi/IETF版本(您可以从浏览器发送的头文件中确定它使用的是哪个版本)。

以下是各种协议版本的规格:

  • 海协75
  • 海协76
  • HyBi/IETF 6455

相关内容

  • 没有找到相关文章

最新更新