这应该是非常微不足道的,但无论出于何种原因,我有一个 将 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,"&").replace(/</g,"<").replace(/>/g,">")
};
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
最佳答案
两件事
将
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
对于
socket.emit
,您需要使用自定义事件 -sockets.emit('response', response);
在客户端
引用 -
socket.emit(hello, { message: 'Welcome, ' + user.nickname + '!',nickname: 'server', gravatar: '' }
socket.on('hello', function (data) { $('#message').text("Received - " + data.message); });
引用 -
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/