2013-02-12 87 views
-1

新來Node.js的在SO搜索了很多答案,但找不到適合這個問題的解決方案。我使用的是自定義的內存緩存服務器代碼的node.js從memcached的服務中獲取數據(使用PHP存儲),添加下面唯一的相關代碼:EADDRINUSE從node.js的

var net = require("net"); 
net.createServer(function(socket) { 
    socket.setEncoding('utf8'); 

    var cmd = {}; 
    var incoming = ''; 
    socket.addListener('receive', function(data) { 
     incoming += data; 
     // in the mid of receiving some data, so we can't 
     // parse it yet. 
     if(data.substring(data.length - 2) != '\r\n') 
      return; 

     data = incoming; 
     incoming = ''; 

     var parts = data.split(/ /); 
     if(parts[0].match(/^(add|set|delete|get|gets)$/i)) { 
      switch(parts[0]) { 
       case 'add': 
        var message = JSON.parse(data.split('\r\n')[1]); 
        self._add.call(socket, parts[1].replace('\r\n', ''), message); 
        break; 

       case 'set': 
        var message = data.split('\r\n')[1]; 
        try { 
         message = JSON.parse(message); 
        } catch(e) {} 
         var subparts = parts[1].replace('\r\n', '').split('/'); 
         self._set.call(socket, subparts.slice(0, 2), subparts.slice(2).join('/'), message); 
       break; 

       case 'delete': 
        self._delete.call(socket, parts[1].replace('\r\n', '')); 
       break; 

       case 'get': 
        self._get.call(socket, parts[1].replace('\r\n', '')); 
       break; 

       case 'gets': 
        var getsparts = parts.slice(1); 
        getsparts[getsparts.length - 1] = 
        getsparts[getsparts.length - 1].replace('\r\n', ''); 
        self._gets.call(socket, getsparts); 
       break; 
      } 
     } 
    }); 
}).listen(11211, "localhost"); 

但每當我試圖啓動節點服務器,它說:EADDRINUSE ,因爲這是由於memcached服務已在端口11211上運行的緣故。如果我將端口更改爲(51242)等其他內容,則錯誤不會顯示,但是沒有數據從memcached中檢索到。

那麼,有沒有使用相同的端口11211從這個Node.js的內存緩存服務器代碼的任何方式,我可以連接到memcached的服務..? 我是Node.js的新手,所以找不到任何可行的解決方案。那麼,我如何解決這個問題而不使用任何node.js memcached模塊,或者我完全在錯誤的路徑..?作爲一個方面說明我運行的memcached服務和Windows 7的NodeJS請提出

更新

而不是

net.createServer(function(socket) { 

我改成下面的測試

this.start = function() { 
     var socket = net.createConnection(11211, "127.0.0.1"); 
     console.log('Socket created.'); 
     socket.on('data', function(data) {   
      console.log('RESPONSE: ' + data); 
     }).on('connect', function() { 

      socket.write("GET/HTTP/1.0\r\n\r\n"); 
     }).on('end', function() { 
      console.log('DONE'); 
     }); 
} 

但在控制檯上,它顯示套接字創建,然後拋出錯誤::錯誤連接ECONNREFUSED

回答

2

這發生,因爲節點應與分佈式緩存進行交互,而不是作爲一個服務器(其結合的端口和接受傳入連接),但作爲一個客戶。看看net.createConnection而不是net.createServer。

+0

感謝您的答覆,將檢查使用的createConnection代替。 – 2013-02-12 04:58:58

+0

似乎拋出新的錯誤「ECONNREFUSED」 .. – 2013-02-12 05:07:13

+0

請更新你上面的代碼,以準確地代表你現在在做什麼。 – TML 2013-02-12 05:08:23