Проблема с Socket.IO с контрольными символами - PullRequest
62 голосов
/ 25 августа 2011

Я реализую приложение, которое использует веб-сокеты и консоль, доступ к которой осуществляется через Telnet. Существует связь между соединением, установленным через веб-сокеты, и консолью. У меня странная проблема:

  • Если я посылаю строковую константу в установленный сокет, когда что-то вводится в консоли, это работает нормально.
  • Если я отправляю строку, полученную из области консоли, кажется, что открывается новый сокет (не уверен), потому что в журнале отладки я вижу его, а на стороне браузера (веб-сокеты) он предупреждает меня о новом соединении.
  • Если я отправляю локальную строку (вместо той, которая получена из другой области), она отправляется правильно. (прокомментированная строка: client.send (message))

Я разделяю здесь код 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 ]

8 голосов
/ 24 ноября 2011

Исправлено с помощью socket.io v0.8.6. На этот вопрос следует ответить / закрыть.

0 голосов
/ 14 ноября 2011

Это как раз тот случай, когда вам нужно динамически распределять память локально. Когда строка входит, вы должны сделать строковую копию строки в динамически распределенную строку той же длины. задача решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...