私はWebソケットとTelnet経由でアクセスするコンソールを使用するアプリケーションを実装しています。 Webソケット経由で確立された接続とコンソール間には通信があります。制御文字でのSocket.IOの問題
- コンソールに何かが入力されたときに、文字列定数を確立されたソケットに送信すると正常に動作します。
- コンソールスコープから受信した文字列を送信すると、デバッグログに表示され、ブラウザ側(Webソケット)に新しい接続が通知されるため、新しいソケットが開かれているようです。
- ローカル文字列を(別のスコープから受信したものではなく)送信すると、正しく送信されます。 (コメント行:client.send(メッセージ))
私はそれが1つのソケットだけを想定して、接続をWebSocketをですので、これは今テストアプリであることを考慮し、ここでnodeJSコードを共有:
// Sample based on: http://elegantcode.com/2011/05/04/taking-baby-steps-with-node-js-websockets/
// Changed for sockets.io 6.x => 7.x
var events = require('events');
var eventEmitter = new events.EventEmitter();
var http = require('http');
var socketIO = require('socket.io');
var static = require('node-static');
var port = 2000;
var clientFiles = new static.Server('./client');
var httpServer = http.createServer(
function(request, response) {
request.addListener('end', function() {
clientFiles.serve(request, response);
});
})
httpServer.listen(port);
console.log("Server running at port: " + port);
var io = require('socket.io').listen(httpServer);
var webSocket = io.sockets;
webSocket.on('connection', function(client) {
client.send('Please enter a user name ...');
var userName;
eventEmitter.on('someOccurence', function(message) {
console.log("Received: " + message);
client.send('Line Received');
var s = 'popo';
client.send(s);
//client.send(message);
});
client.on('message', function(message) {
console.log(message);
if(!userName) {
userName = message;
client.broadcast.send(message + ' has entered the zone.');
return;
}
var broadcastMessage = userName + ': ' + message;
client.broadcast.send(broadcastMessage);
client.send("Repeated here: " + message);
});
client.on('disconnect', function() {
var broadcastMessage = userName + ' has left the zone.';
client.broadcast.send(broadcastMessage);
});
});
var lines = require('lines-adapter');
var net = require('net');
var server = net.createServer(function (socket) {
socket.write("Welcome to the Server\r\n");
lines(socket, 'utf8')
.on("data",
function(line) {
console.log("Line received: " + line);
eventEmitter.emit('someOccurence', line);
}
)
.end("end",
function() {
console.log("End of Stream");
}
);
});
server.listen(1337, "127.0.0.1");
更新日:私はこの問題なしでsocket.io 0.8.6とnodeJS 0.4.12でテストしました。私はこの質問を今後の参考にしておくつもりです。
さらに2つのリスニングサーバを持つnodejsでネットライブラリを使用して同じコードをテストすると、すべてうまく動作するため、バグがsocket.ioコードの周りにあることがわかります。現在、私のコード、socket.ioまたはnodeJSにバグがあるかどうかを特定する知識はありません。 –
詳細:telnetの制御文字や "\ n"と関連しているようです。 –
実際には\ rです。 –