websocket客户端中的onmessage事件没有被解雇 [英] onmessage event in websocket client is not getting fired

查看:1843
本文介绍了websocket客户端中的onmessage事件没有被解雇的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用node.js来实现websocket服务器和客户端。它们之间的握手看起来像这样。

I am using node.js to implement websocket server and client. The handshake between them looks like this.

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

Request URL: ws://localhost:8015/

请求方法:获取

状态代码:101切换协议

Status Code: 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事件只会被触发一次。

The server is getting the message sent from client (I am logging the message on console), however onmessage event in client is not getting fired when server sends the message. The other thing confusing me is as soon as connection is opened, onmessage event in clients gets fired only once.

请帮助......我试图将服务器上的消息回显给客户。

Please help...I am trying to echo the message on the server back to client.

编辑:

这就是我在websocket客户端处理事件的方式......

This is how I am handling events in websocket client...

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));
};

以下是我实施服务器的方式..

And here's how I had implemented server..

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.');
    });
});


推荐答案

这些行是您的问题所在:

These lines are responsible for your problem:

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

让我们分析一下。 html5WebSocketClient.onOpen(event); 使用参数 event onOpen >( undefined )并返回 undefined onOpen 没有任何回报)。因此 connection.onopen 变为未定义。但是 connection.onopen 应该是一个函数。因此,不要只调用这些函数:

Let's analyze this. html5WebSocketClient.onOpen(event); calls onOpen with argument event (which is undefined) and returns undefined (onOpen does not return anything). Thus connection.onopen becomes unedefined. But connection.onopen is supposed to be a function. So instead of calling these functions simply do this:

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

这篇关于websocket客户端中的onmessage事件没有被解雇的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆