2011-08-25 13 views
62

मैं ऐसे एप्लिकेशन को कार्यान्वित कर रहा हूं जो वेबनेट्स और टेलनेट के माध्यम से उपयोग किए गए कंसोल का उपयोग करता है। Websockets और कंसोल के माध्यम से स्थापित कनेक्शन के बीच एक संचार है। मुझे एक अजीब समस्या का सामना करना पड़ रहा है:नियंत्रण chars के साथ सॉकेट.आईओ मुद्दे

  • यदि मैं कंसोल में कुछ दर्ज होने पर एक स्थापित सॉकेट को स्ट्रिंग स्थिर भेजता हूं तो यह ठीक काम करता है।
  • यदि मैं कंसोल स्कोप से प्राप्त एक स्ट्रिंग भेजता हूं तो यह एक नई सॉकेट खोलने लगता है (यकीन नहीं है) क्योंकि डीबग लॉग में मैं इसे देखता हूं और ब्राउज़र पक्ष (websockets) में यह मुझे एक नए कनेक्शन के बारे में चेतावनी देता है।
  • यदि मैं स्थानीय स्ट्रिंग भेजता हूं (दूसरे दायरे से प्राप्त एक के बजाय) यह सही ढंग से भेजा जाता है। (टिप्पणी की पंक्ति: 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"); 

अद्यतन: मैंने इस मुद्दे के बिना सॉकेट.io 0.8.6 और नोडजेएस 0.4.12 के साथ परीक्षण किया। मैं भविष्य में संदर्भ के लिए यह प्रश्न यहां रखूंगा।

+0

आगे की खोज मैं देख सकता हूं कि बग socket.io कोड के आस-पास स्थित है क्योंकि यदि मैं नोडजेज़ के तहत नेट लाइब्रेरी का उपयोग करके एक ही कोड का परीक्षण करता हूं जिसमें दो श्रवण सर्वर सबकुछ ठीक काम करता है। वर्तमान में मेरे पास सॉकेट.ओओ या नोडजेएस में, मेरे कोड में कोई बग है या नहीं, तो मुझे यह पता लगाने का ज्ञान नहीं है। –

+0

अधिक जानकारी: यह टेलनेट नियंत्रण वर्णों और/या "\ n" –

+1

से संबंधित है, यह वास्तव में '\ r' है। –

उत्तर

8

socket.io v0.8.6 के साथ फिक्स्ड। इस क्यू का उत्तर/बंद होना चाहिए।

-3

यह केवल एक मामला है जहां आपको गतिशील रूप से स्मृति को स्थानीय रूप से आवंटित करने की आवश्यकता होती है। जब स्ट्रिंग आती है तो आपको स्ट्रिंग की एक स्ट्रिंग प्रति को एक ही लंबाई की गतिशील आवंटित स्ट्रिंग में करना चाहिए। समस्या सुलझ गयी।

+2

मैं _strongly_ इस पर शक है। –

+1

जावास्क्रिप्ट में स्ट्रिंग्स अपरिवर्तनीय हैं। –

+0

मैंने कुछ अजीब हैंडलिंग में भी सोचने की कोशिश की, लेकिन काम नहीं करता है। –

संबंधित मुद्दे