extjs4 - socket.io 与 ExtJS 和 socket.io-client

标签 extjs4 socket.io

这应该是非常微不足道的,但无论出于何种原因,我有一个 将 ExtJS4 连接到 socket.io/node.js 服务(使用 npm 和 node 0.6.3 的最新版本)没有什么问题。我正在尝试向我的服务器发送消息。它握手,但永远不会进入消息 block 。我正在使用“emit”从 socket.io-client 发送它,但没有运气。知道我做错了什么吗?

我有我的所有代码(从 Nils Dehl 优秀的 example fork )并从服务器调试如下......

我将此代码作为我的 server.js:

var http = require('http'),
           sys  = require('util'),
           fs   = require('fs'),
           io   = require('socket.io');
var Connect = require('connect');

var server = Connect.createServer(
        Connect.logger(), // Log responses to the terminal using Common Log Format.
        Connect.staticCache(), // Add a short-term ram-cache to improve performance.
        Connect.profiler(), 
        Connect.favicon(),
        Connect.static(__dirname + "/public") // Serve all static files in the current dir.
);
var sockets = io.listen(server);
server.listen(4000);

sockets.on('connection', function(socket) {
console.log("Receiving msg...");
        var user;

        socket.on('message', function(message) {
                if (!user) {
                        user = message;
                        socket.send({ message: 'Welcome, ' + user.nickname + '!', nickname: 'server', gravatar: '' });
                        return;
                }
                var response = {
                        'nickname': user.nickname,
                        'gravatar': user.gravatar,
                        'message': message.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")
                };
                sockets.emit(response);
        });

});

然后在客户端我使用 ExtJS 和 socket.io-client 发送 消息。我在 ExtJS 中的界面看起来像这样调用 套接字 io.client:

App.util.Socketio = Ext.extend(Ext.util.Observable, { 
        constructor: function(options){ 
                options = options || {}; 
                App.util.Socketio.superclass.constructor.call( 
                        this 
                ); 
                this.socket = new io.Socket(options); 
                var that = this; 
                this.socket.on('connect', function(){ 
                        that.onConnect(); 
                }); 
                this.socket.on('message', function(data){ 
                        that.onMessage(data); 
                }); 
                this.socket.on('close', function(){ 
                        that.onClose(); 
                }); 
                this.socket.on('disconnect', function(){ 
                        that.onDisconnect(); 
                }); 
        }, 
        connect: function() { 
                this.socket.connect(); 
        }, 
        disconnect: function(){ 
                this.socket.disconnect(); 
        }, 
        send: function(message) { 
                this.socket.emit(message); 
        }, 
        onConnect: function() { 
                this.fireEvent('connect'); 
        }, 
        onDisconnect: function() { 
                this.fireEvent('disconnect'); 
        }, 
        onClose: function() { 
                this.fireEvent('close'); 
        }, 
        onMessage: function(message) { 
                this.fireEvent('message', message); 
        } 
}); 

这是我看到的输出:

info  - socket.io started 
   debug - client authorized 
   info  - handshake authorized 16300591002012036186 
   debug - client authorized 
   info  - handshake authorized 4532571941614163017 
   debug - setting request GET /socket.io/1/websocket/ 
16300591002012036186 
   debug - set heartbeat interval for client 16300591002012036186 
   debug - client authorized for 
   debug - websocket writing 1:: 
   debug - setting request GET /socket.io/1/websocket/ 
4532571941614163017 
   debug - set heartbeat interval for client 4532571941614163017 
   debug - client authorized for 
   debug - websocket writing 1:: 
   debug - emitting heartbeat for client 16300591002012036186 
   debug - websocket writing 2:: 
   debug - set heartbeat timeout for client 16300591002012036186 
   debug - emitting heartbeat for client 4532571941614163017 
   debug - websocket writing 2:: 
   debug - set heartbeat timeout for client 4532571941614163017 
   debug - got heartbeat packet 
   debug - cleared heartbeat timeout for client 16300591002012036186 
   debug - set heartbeat interval for client 16300591002012036186 
   debug - fired heartbeat timeout for client 4532571941614163017 
   info  - transport end 
   debug - set close timeout for client 4532571941614163017 
   debug - cleared close timeout for client 4532571941614163017 
   debug - discarding transport 

最佳答案

两件事

  1. socket.send({ message: 'Welcome, ' + user.nickname + '!',nickname: 'server', gravatar: '' }) 更改为socket.emit(hello, { message: 'Welcome, ' + user.nickname + '!',nickname: 'server', gravatar: '' }。您应该使用 emit 用于发送 JSON

    示例 - https://github.com/parj/node-websocket-demo/blob/socket_emit/server.js

  2. 对于socket.emit,您需要使用自定义事件 - sockets.emit('response', response);

在客户端

  1. 引用 - socket.emit(hello, { message: 'Welcome, ' + user.nickname + '!',nickname: 'server', gravatar: '' }

    socket.on('hello', function (data) {
       $('#message').text("Received - " + data.message);
     });
    
  2. 引用 - sockets.emit('response', response);

    socket.on('resonse', function (data) {
       $('#message').text("Received - " + data.response);
     });
    

socket.send 仅用于发送字符串 - 示例 socket.send("Hello");

有关 socket.send 的完整工作示例,请参阅 - https://github.com/parj/node-websocket-demo 对于socket.emit,请参阅-https://github.com/parj/node-websocket-demo/tree/socket_emit/public

关于extjs4 - socket.io 与 ExtJS 和 socket.io-client,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8513684/

相关文章:

javascript - 如何将此回调参数转换为 promise ?

javascript - 当 initcomponent 加载 store extjs 4.1.1 时, View 不显示 store

extjs - 在网格 sortchange 事件之前更改 store extraParams

extjs - 如何使用 extjs 4.0 beta 3 制作 "MVC Application"?

ExtJS 应用程序事件问题

node.js - Socket.io:服务器需要 2 个连接才能第一个响应

python - Socket.IO 与 Twisted

javascript - 无法加载资源 - Socket.IO

ios - socket.IO-objc 示例返回服务器代码 400

javascript - ExtJs - 检查 Ext.Array 是否为空的最佳方法?