当前位置: 首页 > 知识库问答 >
问题:

HTML5WebSocket服务器

史洛城
2023-03-14

我正在尝试创建一个基本的websocket服务器,服务器从客户端接收握手,但是客户端似乎没有接受服务器的握手响应。我对“Sec WebSocket键”也有疑问,我认为哈希值太长了!谢谢:)

 import socket


def handle(s):
    print repr(s.recv(4096))


s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
s.bind(('',9876))
s.listen(2)

handshakes='\
HTTP/1.1 101 Web Socket Protocol Handshake\r\n\
Upgrade: WebSocket\r\n\
Connection: Upgrade\r\n\
WebSocket-Origin: null\r\n\
WebSocket-Location: ws://localhost:9876/\r\n\
'
def handshake(hs):
    hslist = hs.split('\r\n')
    body = hs.split('\r\n\r\n')[1]
    key = ''
    cc = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'

    for h in hslist:
        if h.startswith('Sec-WebSocket-Key:'):
            key = h[19:]
        else:
            continue

    print key

    import hashlib
    import base64
    s = hashlib.sha1()
    s.update(key+cc)
    h = s.hexdigest()
    print 's = ', s
    print 'h = ', h
    return base64.b64encode(h)

while True:
    c,a = s.accept()
    print c
    print a
    msg = c.recv(4096)
    if(msg):

        print msg
        print 'sending handshake ...'
        handshakes += 'Sec-WebSocket-Accept: '+str(handshake(msg))+'\r\n\r\n'
        print handshakes
        c.send(handshakes)
            c.send('Hello !')
            break;

[已编辑]

客户:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Web Socket Example</title>
    <meta charset="UTF-8">
    <script>
      window.onload = function() {
        var s = new WebSocket("ws://localhost:9876/");
        s.onopen = function(e) { alert("opened"); }
        s.onclose = function(e) { alert("closed"); }
        s.onmessage = function(e) { alert("got: " + e.data); }
      };
    </script>
  </head>
    <body>
      <div id="holder" style="width:600px; height:300px"></div>
    </body>
</html>

服务器输出:

<socket._socketobject object at 0xb727bca4>
('127.0.0.1', 46729)
GET / HTTP/1.1
Host: localhost:9876
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:15.0) Gecko/15.0 Firefox/15.0a1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive, Upgrade
Sec-WebSocket-Version: 13
Origin: null
Sec-WebSocket-Key: wZG2EaSH+o/mL0Rr9Efocg==
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket


sending handshake ...
wZG2EaSH+o/mL0Rr9Efocg==
s =  <sha1 HASH object @ 0xb729d660>
h =  49231840aae5a4d6e1488a4b34da39af372452a9
HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: null
WebSocket-Location: ws://localhost:9876/
Sec-WebSocket-Accept: NDkyMzE4NDBhYWU1YTRkNmUxNDg4YTRiMzRkYTM5YWYzNzI0NTJhOQ==


handshake sent

共有1个答案

和谦
2023-03-14

我认为您需要调用sha.digest()来代替hexdigest()。您需要一个20字节的二进制哈希传递到您的Base64编码器;digest()执行此操作,而hexdigest()将这些字节中的每一个转换为2字节的十六进制表示。

有关详细信息,请参见python sha文档。

 类似资料:
  • 如何包含Eureka服务器 要在项目中包含Eureka服务器,请使用组org.springframework.cloud和工件id spring-cloud-starter-eureka-server的启动器。有关 使用当前的Spring Cloud发布列表设置构建系统的详细信息,请参阅Spring Cloud项目页面。 如何运行Eureka服务器 示例eureka服务器; @SpringBoot

  • hprose 为发布服务提供了多个方法,这些方法可以随意组合,通过这种组合,你所发布的服务将不会局限于某一个函数,某一个方法,某一个对象,而是可以将不同的函数和方法随意重新组合成一个服务。 AddFunction 方法 AddFunction(name string, function interface{}, option ...Options) Service 该方法的用于发布一个函数(命名函

  • Debug 字段 该设置默认值是 false,当发生错误时,只返回错误信息本身。 当该字段设置为 true 时,当发生 panic 时,会将整个 panic 的错误堆栈信息返回给客户端,在用户进行 hprose 服务开发时,该设置可以帮助你快速定位错误位置。 ErrorDelay 字段 该设置为整型值,默认值为 10 秒。 该字段表示在调用执行时,如果发生异常,将延时一段时间后再返回给客户端。 在

  • null null Tomcat服务器正在运行servlet,为mySQL数据库执行一些业务逻辑和hibernate框架。 现在我有点糊涂了。两台服务器都能接收HTTP请求吗?就像servlet从网页接收https请求和我的apache服务器一样? 并且两者都可以连接到数据库--使用php的apache服务器,正如我提到的,同时使用servlet的tomcat?

  • 如何在生产环境中将hazelcast服务器作为linux服务运行? java-server-cp hazelcast。jar com。黑兹卡斯特。例子。StartServer StartServer运行带有输出到std终端的服务器,将其作为linux服务运行并将日志写入文件的最简单方法是什么 我必须将其设置为EC2实例中的服务并将其捆绑。当EC2自动缩放启动实例时,hazelcast服务器将启动并

  • 创建 http 服务器 package main   import ( "net/http"   "github.com/hprose/hprose-golang/rpc" )   func hello(name string) string { return "Hello " + name + "!" }   func main() { service := rp