2011-08-25 29 views
62

Tôi đang triển khai ứng dụng sử dụng các ổ cắm web và bảng điều khiển được truy cập qua Telnet. Có một thông tin liên lạc giữa kết nối được thiết lập thông qua websockets và giao diện điều khiển. Tôi đang gặp phải sự cố lạ:Vấn đề Socket.IO với các ký tự điều khiển

  • Nếu tôi gửi một chuỗi liên tục đến ổ cắm đã được thiết lập khi có gì đó được nhập trong bảng điều khiển, nó hoạt động tốt.
  • Nếu tôi gửi một chuỗi nhận được từ phạm vi giao diện điều khiển Có vẻ như mở một ổ cắm mới (không chắc chắn) vì trong nhật ký gỡ lỗi tôi thấy nó và ở phía trình duyệt (websockets) nó thông báo cho tôi về kết nối mới.
  • Nếu tôi gửi một chuỗi địa phương (thay vì chuỗi nhận được từ phạm vi khác), nó được gửi chính xác. (Dòng nhận xét: client.send (message))

tôi chia sẻ ở đây mã nodeJS, đưa vào tài khoản mà này bây giờ là một ứng dụng thử nghiệm vì vậy nó giả định chỉ có một ổ cắm và WebSockets kết nối:

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

CẬP NHẬT: Tôi vừa thử nghiệm với socket.io 0.8.6 và nodeJS 0.4.12 mà không gặp sự cố này. Tôi sẽ giữ câu hỏi này ở đây để tham khảo trong tương lai.

+0

Nghiên cứu thêm Tôi có thể thấy rằng lỗi nằm xung quanh mã socket.io vì nếu tôi kiểm tra cùng một mã bằng cách sử dụng thư viện net dưới nodejs với hai máy chủ nghe, mọi thứ hoạt động tốt. Hiện tại tôi không có kiến ​​thức để xác định nếu có lỗi trong mã của tôi, trong socket.io hoặc trong nodeJS. –

+0

Thông tin thêm: có vẻ như liên quan đến các ký tự điều khiển telnet và/hoặc "\ n" –

+1

thực sự là '\ r'. –

Trả lời

8

Đã sửa bằng socket.io v0.8.6. Q này phải được trả lời/đóng.

-3

Đây chỉ là trường hợp bạn cần phân bổ bộ nhớ động cục bộ. Khi chuỗi đến trong bạn nên làm một chuỗi sao chép của chuỗi thành một chuỗi được phân bổ động có cùng độ dài. vấn đề được giải quyết.

+2

Tôi _strongly_ nghi ngờ điều này. –

+1

Chuỗi trong JavaScript là không thay đổi. –

+0

Tôi đã cố gắng quá suy nghĩ trong một số xử lý kỳ lạ, nhưng không hoạt động. –

Các vấn đề liên quan