Websocket:onmessage不会被调用,只能在Windows

时间:2016-01-18 11:57:35

标签: javascript windows websocket

我们遇到与Windows客户端进行Websocket通信的问题。 作为最小化设置,我们使用python3 autobahn websocket乒乓球示例。

服务器来自(https://github.com/crossbario/autobahn-python/blob/master/examples/asyncio/websocket/echo/server.py)。唯一的修改是服务器在打开连接时向客户端发送消息。

客户端也是从高速公路乒乓球示例中获取的,但是以两种方式进行了修改。它接受来自远程服务器的连接,它不会向服务器发送消息,但它需要一个消息。

这对我的Linux机器上的所有浏览器都有效,但它不适用于Windows客户端。但是,如果我在打开连接后立即从客户端发送消息,那么客户端也可以接收消息。

这是pyhton3服务器:

from autobahn.asyncio.websocket import WebSocketServerProtocol, \
    WebSocketServerFactory


class MyServerProtocol(WebSocketServerProtocol):

    def onConnect(self, req.uest):
        print("Client connecting: {0}".format(request.peer))

    def onOpen(self):
        print("WebSocket connection open.")
        self.sendMessage('server hello'.encode('utf8'))

    def onMessage(self, payload, isBinary):
        if isBinary:
            print("Binary message received: {0} bytes".format(len(payload)))
        else:
            print("Text message received: {0}".format(payload.decode('utf8')))

        # echo back message verbatim
        self.sendMessage(payload, isBinary)

    def onClose(self, wasClean, code, reason):
        print("WebSocket connection closed: {0}".format(reason))


if __name__ == '__main__':

    import asyncio

    factory = WebSocketServerFactory(u"ws://0.0.0.0:9000", debug=False)
    factory.protocol = MyServerProtocol

    loop = asyncio.get_event_loop()
    coro = loop.create_server(factory, '0.0.0.0', 9000)
    server = loop.run_until_complete(coro)

    try:
        loop.run_forever()
    except KeyboardInterrupt:
        pass
    finally:
        server.close()
        loop.close()

这是Websocket客户端:



<!DOCTYPE html>
<html>
   <head>
      <script type="text/javascript">
         var socket = null;
         var isopen = false;

         window.onload = function() {

            socket = new WebSocket("ws://" + location.hostname + ":9000");

            socket.onopen = function() {
               console.log("Connected!");
               isopen = true;
               //if I do this, then it works
               //socket.send('hello from client'.encode('utf-8'))
            }

            socket.onmessage = function(e) {
               console.log("Text message received: " + e.data);
            }

            socket.onclose = function(e) {
               console.log("Connection closed.");
               socket = null;
               isopen = false;
            }
         };
      </script>
   </head>
   <body>
   </body>
</html>
&#13;
&#13;
&#13; 有人知道我错过了什么吗?我想打开从服务器到客户端的连接,而不首先从客户端发送消息。

0 个答案:

没有答案