2011-08-25 13 views
62

私は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でテストしました。私はこの質問を今後の参考にしておくつもりです。

+0

さらに2つのリスニングサーバを持つnodejsでネットライブラリを使用して同じコードをテストすると、すべてうまく動作するため、バグがsocket.ioコードの周りにあることがわかります。現在、私のコード、socket.ioまたはnodeJSにバグがあるかどうかを特定する知識はありません。 –

+0

詳細:telnetの制御文字や "\ n"と関連しているようです。 –

+1

実際には\ rです。 –

答えて

8

socket.io v0.8.6で修正されました。このqは答えられるべきである。

-3

これは、メモリをローカルに動的に割り当てる必要がある場合に過ぎません。文字列が来たら、同じ長さの動的に割り当てられた文字列に文字列の文字列コピーを行うべきです。問題が解決しました。

+2

私はこのことを間違いなく疑っています。 –

+1

JavaScriptの文字列は不変です。 –

+0

私はそれをあまりにも奇妙な扱いで考えましたが、うまくいきません。 –

関連する問題