2011-08-25 25 views
62

我實現使用的WebSockets和通過Telnet訪問控制檯應用程序。在通過websockets和控制檯建立的連接之間存在通信。我遇到一個奇怪的問題:Socket.IO問題與控制字符

  • 如果我發送一個字符串常量到一個建立的套接字,當在控制檯中輸入的東西時,它工作正常。
  • 如果我把從控制檯範圍收到字符串,似乎是因爲在調試日誌我看到它,並在瀏覽器端(網頁套接字)打開一個新的套接字(不知道),它提醒了我一個新的連接。
  • 如果我發送一個本地字符串(而不是從其他範圍內接收到的一個),它的正確發送。 (註釋行:client.send(消息))

我在這裏分享代碼的NodeJS,考慮到這是現在一個測試應用程序,所以它假定只有一個插座和連接的WebSockets:

// 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

進一步研究,我可以看到錯誤就在酒店附近socket.io代碼,因爲如果我有兩個聽測試服務器使用的NodeJS下網庫相同的代碼一切工作正常。目前我還沒有知識來查明我的代碼,socket.io或nodeJS中是否存在錯誤。 –

+0

更多信息:它似乎與telnet控制字符和/或「\ n」 –

+1

實際上是'\ r'。 –

回答

8

修正了socket.io v0.8.6。這個q應該被回答/關閉。

-3

這只是你需要在本地動態分配內存的情況下。當字符串進入時,您應該將字符串的字符串副本轉換爲長度相同的動態分配字符串。問題解決了。

+2

我非常懷疑這一點。 – 2011-11-16 14:11:43

+1

JavaScript中的字符串是不可變的。 –

+0

我試圖在一些奇怪的處理思想,但不起作用。 –