WebSocket客户端中的onmessage事件未被触发。

4

我将使用node.js来实现websocket服务器和客户端。它们之间的握手过程如下:

请求URL:ws://localhost:8015/

请求方法:GET

状态码:101 Switching Protocols

请求头

Cache-Control: no-cache
Connection: Upgrade
Cookie: SQLiteManager_currentLangue=2
Host: localhost:8015
Origin: http:/localhost:8080
Pragma: no-cache
Sec-WebSocket-Extensions: x-webkit-deflate-frame
Sec-WebSocket-Key: A/knWtXFtTa5V6po8XOfjg==
Sec-WebSocket-Protocol: echo-protocol
Sec-WebSocket-Version: 13
Upgrade: websocket
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36

响应头

Connection: Upgrade
Origin: http:/localhost:8080
Sec-WebSocket-Accept: 5OUv+g5mBPxVDug4etJfGX4lxIo=
Sec-WebSocket-Protocol: echo-protocol
Upgrade: websocket

服务器已经接收到客户端发送的消息(我在控制台上记录了该消息),但是当服务器发送消息时,客户端的onmessage事件没有被触发。另一个让我困惑的事情是,只要连接打开,客户端的onmessage事件就只会被触发一次。
请帮忙……我正在尝试将服务器上的消息回显到客户端。
编辑:
这是我在websocket客户端中处理事件的方式...
html5WebSocketClient.connect = function(){
     if(window.WebSocket != undefined){
         if(connection.readyState == undefined || connection.readyState > 1)
             connection = new WebSocket('ws://localhost:8015/','echo-protocol');
     }
     if (window.MozWebSocket) {
          window.WebSocket = window.MozWebSocket;
     }

 connection.onopen = html5WebSocketClient.onOpen(event);
 connection.onmessage = html5WebSocketClient.onMessage(event);
 connection.onclose = html5WebSocketClient.onClose(event); 
 connection.onerror = html5WebSocketClient.onError(event);

};

html5WebSocketClient.onOpen = function(event)
{
    $('#some_label').text("Connected");
};

html5WebSocketClient.onClose = function(event)
{
    $('#some_label').text("Disconnected");
};

html5WebSocketClient.onError = function(event)
{
    $('#some_label').text("Error");
};

//This is only getting fired when connection opens
html5WebSocketClient.onMessage = function(message)
{
    if(message.data != undefined)
        {
        alert($.parseJSON(message.data));
    }
};

//Server is getting this message
html5WebSocketClient.sendMessage = function()
{
   var message = {"name": value, "name": value};
   connection.send(JSON.stringify(message));
};

以下是我实现服务器的方法...

var http = require('http');
var WebSocketServer = require('websocket').server;

var server = http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Node.js From HTML5\n');
}).listen(8015, "127.0.0.1");

wsServer = new WebSocketServer({
    httpServer: server,
    autoAcceptConnections: false
});

wsServer.on('request', function(request) {

    var connection = request.accept('echo-protocol', request.origin);
    console.log((new Date()) + ' Connection accepted.');
    connection.on('message', function(message) {
        if (message.type === 'utf8') {
            console.log('Received Message: ' + message.utf8Data);
            connection.send(message.utf8Data); //Client is not getting this message..?
        }
    });
    connection.on('close', function(reasonCode, description) {
        console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.');
    });
});

展示一些代码。我怀疑这与握手无关。 - freakish
@freakish:我已经在上面添加了WebSocket客户端和服务器端的代码,请帮忙。 - Sheetal Jadhwani
1个回答

7
以下这几行代码引起了你的问题:
connection.onopen = html5WebSocketClient.onOpen(event);
connection.onmessage = html5WebSocketClient.onMessage(event);
connection.onclose = html5WebSocketClient.onClose(event); 
connection.onerror = html5WebSocketClient.onError(event);

让我们来分析一下。 html5WebSocketClient.onOpen(event); 调用带有参数 event (它是 undefined) 的 onOpen 并返回 undefined (onOpen 不返回任何内容)。因此,connection.onopen 变成了 undefinded。但是 connection.onpen 应该是一个函数。所以,不要直接调用这些函数,而应该这样做:
connection.onopen = html5WebSocketClient.onOpen;
connection.onmessage = html5WebSocketClient.onMessage;
connection.onclose = html5WebSocketClient.onClose; 
connection.onerror = html5WebSocketClient.onError;

非常感谢@freakish!! 它真的解决了我的问题。作为一个NodeJs的新手,我没有意识到这个错误..非常感谢!! - Sheetal Jadhwani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接