1

簡単なテキスト チャット ソケット サーバーを作成しようとしています。サーバーのコーディングは初めてです。私はこの作業コードを持っていますが、問題は WebSocket() が静かに死ぬことです:

javascript コンソールの出力は開いて閉じています

この動作を理解するのに役立つリソースはほとんどありません。ヘッダーが送信されると、Python サーバーが接続を切断するのはなぜですか? 正しい方法で応答を送信していますか? どんな助けでも素晴らしいでしょう。


Python コード:



    import socketserver
    import re
    from base64 import b64encode
    from hashlib import sha1

    inited = 0

    class MyTCPHandler(socketserver.BaseRequestHandler):

        def handle(self):
            global inited
            if(inited==0):
                print(self)
                text = self.request.recv(1024).strip()
                self.upgradeConnection(text)
                self.request.send("a sweet message from the server!".encode("utf-8"));
                inited = 1
            else:
                self.request.sendall("second response!".encode("utf-8"));

        def upgradeConnection(self,text):
            #print("Client wants to upgrade:")
            #print(text);
            websocket_answer = (
                'HTTP/1.1 101 Switching Protocols',
                'Upgrade: websocket',
                'Connection: Upgrade',
                'Sec-WebSocket-Accept: {key}\r\n\r\n',
            )

            GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
            #print(re.search(b'Sec-WebSocket-Key:\s+(.*?)[\n\r]+', text))
            key = (re.search(b'Sec-WebSocket-Key:\s+(.*?)[\n\r]+', text)
                .groups()[0]
                .strip())

            #print(key.decode("utf-8"))
            #print(key.decode("utf-8") + GUID)
            #print(sha1((key.decode("utf-8") + GUID).encode("utf-8")))

            response_key = b64encode(sha1((key.decode("utf-8") + GUID).encode("utf-8")).digest()).decode("utf-8")
            #print(response_key)
            response = '\r\n'.join(websocket_answer).format(key=response_key)
            self.request.send(response.encode("utf-8"));




    HOST, PORT = "localhost", 9999
    server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
    server.serve_forever()

ウェブページのコード:



    url = "ws://127.0.0.1:9999/";

    var sk = new WebSocket(url);


    sk.onopen = function(e){
        console.log("open");
        sk.send("the client is here!!");
    }
    sk.onmessage = function(e){
        console.log("message");
        console.log(e.data);
    }
    sk.onerror = function(e){
        console.log("error");
    }
    sk.onclose = function(e){
        console.log("closed");
    }
    
4

0 に答える 0