2011-08-25 12 views
62

sto implementando un'applicazione che utilizza WebSockets e una console accessibile tramite Telnet. Esiste una comunicazione tra la connessione stabilita tramite websocket e la console. Sto riscontrando un problema strano:problema Socket.IO con caratteri di controllo

  • Se invio una stringa costante a un socket stabilito quando qualcosa viene inserito nella console funziona correttamente.
  • Se invio uno stringa ricevuta dal campo di applicazione console sembra aprire un nuovo socket (non sono sicuro), perché nel registro di debug lo vedo e nel lato del browser (WebSockets) mi avvisa di una nuova connessione.
  • Se invio una stringa locale (al posto di quello ricevuto dall'altra campo di applicazione) è inviato correttamente. (Linea commentato: client.send (messaggio))

Condivido qui il codice nodeJS, tener conto che questo è ora un'applicazione di prova in modo che sia assunto solo una presa di corrente e WebSockets collegamento:

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

UPDATE: ho appena provato con socket.io 0.8.6 e 0.4.12 nodeJS senza questo problema. Terrò questa domanda qui per riferimento futuro.

+0

Ricercando ulteriormente posso vedere che il bug si trova a circa il codice socket.io perché se provo lo stesso codice che utilizza la libreria rete sotto nodejs con due server ascolto tutto funziona bene. Attualmente non ho le conoscenze per individuare se c'è un bug nel mio codice, in socket.io o in nodeJS. –

+0

Ulteriori informazioni: sembra correlato ai caratteri di controllo telnet e/o "\ n" –

+1

in realtà è "\ r". –

risposta

8

fissati con socket.io v0.8.6. Questo q dovrebbe essere risposto/chiuso.

-3

questo è solo un caso in cui è necessario allocare dinamicamente la memoria a livello locale. Quando arriva la stringa, dovresti fare una copia stringa della stringa in una stringa allocata dinamicamente della stessa lunghezza. problema risolto.

+2

Ne dubito fortemente. –

+1

Le stringhe in JavaScript sono immutabili. –

+0

Anch'io ci ho provato pensando in modo strano, ma non funziona. –

Problemi correlati