62 votes

Socket.IO problème avec les caractères de contrôle

Je suis la mise en œuvre d'une application qui utilise les websockets, et une console accessible via Telnet. Il y a une communication entre la connexion établie via les websockets et la console. Je suis en train de vivre une drôle de question:

  • Si j'envoie une constante de chaîne à une prise quand quelque chose est entré dans la console il fonctionne ok.
  • Si j'envoie une chaîne de caractères reçue à partir de la console portée, Il semble ouvrir un nouveau socket (pas sûr), parce que dans le journal de débogage je les vois et dans le navigateur côté (websockets) il me prévient d'une nouvelle connexion.
  • Si j'envoie une chaîne locale (à la place de celui reçu de l'autre champ d'application), il est envoyé correctement. (a commenté la ligne: le client.send(message) )

Je partage ici la nodeJS code, de prendre en compte le fait que c'est maintenant une application de test de sorte qu'il est supposé une seule prise et websockets connexion:

// 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");

Mise à JOUR: je viens de tester avec la prise.io 0.8.6 et nodeJS 0.4.12 sans ce problème. Je vais garder cette question ici pour référence future.

8voto

Michael Durrant Points 30342

Fixe avec la prise.io v0.8.6. Ces questions doivent être répondues/fermé.

-3voto

Androider Points 4280

C'est juste un cas où vous avez besoin d'allouer dynamiquement de la mémoire locale. Lorsque la chaîne vient vous devriez faire une copie de chaîne de la chaîne dans un allouée dynamiquement chaîne de même longueur. le problème est résolu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X