2015-09-03 86 views
1

我正在嘗試創建一個簡單的Node.js腳本,該腳本在未使用分配的端口時創建服務器,或者如果端口正在連接到服務器用過的。我正在使用遞歸方法(使用this鏈接作爲參考),所以我在兩個不同的cmd窗口上運行相同的.js文件。Node.js:即使allowHalfOpen設置爲True,客戶端與服務器斷開連接

問題是,每當客戶端連接到服務器,它會自動進入'結束'偵聽器,我不知道爲什麼。閱讀文檔後,我發現了關於allowHalfOpen屬性,它的下面是API中說:

如果allowHalfOpen爲真,則套接字不會自動發送一個FIN數據包時的另一端套接字發送一個FIN數據包。

我認爲這是顯而易見的解決方案,所以我在服務器上將屬性設置爲true,但這也不起作用。

下面是代碼:

var net = require('net'); 

var PORT_NUMBER = 1337; 

connectToPort = function(connection) { 
    if(connection === "server") { // Connect as server to the port. 
     connectAsServer(); 
    } else if (connection == "client") { // Connect as client to the port. 
     connectAsClient(); 
    } else { 
     console.log("Incorrect Type Of Connection Passed."); 
    } 
} 

connectAsServer = function() { 
    // Attempt to create server. 
    var server = net.createServer({allowHalfOpen:true}, function (socket) { 
     socket.allowHalfOpen = true; 

     socket.write('Hello from Server\r\n'); 
     socket.end("hello"); 
     console.log("someone went into server."); 
     socket.pipe(socket); 
    }); 

    console.log("Trying to Open Port " + PORT_NUMBER); 

    server.listen(PORT_NUMBER, function() { 
     console.log("\nServer 2 is now the official server. \n"); 
    }); 

    server.on('error', function(err) { 
     console.log("error is " + err.code); 
     if(err.code == 'EADDRINUSE') { 
      console.log('Port is in use, becoming client...'); 
      setTimeout(function() { 
       server.close(); 
       connectToPort("client"); 
      }, 1000); 
     } 
     if(err.code == 'ECONNRESET') { 
      console.log("connection reset error."); 
     } 
    }); 

    server.on('end', function() { 
     console.log("server 2 disconnected from port"); 
    }); 
} 

connectAsClient = function() { 

    var client = net.connect({port: PORT_NUMBER}, function() { //'connect' listener 
     console.log('THIS IS CLIENT connected to server!'); 
    }); 

    client.on('data', function(data) { 
     console.log(data.toString()); 
     client.write('hello world! from client!!\r\n'); 
    }); 

    client.on('end', function() { 
     // client automatically goes here. 
     console.log('disconnected from server'); 
    }); 

    client.on('error', function(err) { 
     console.log("there was an error in the client and the error is: " + err.code); 
    }); 
} 

connectToPort("server"); 

這裏是從控制檯輸出:

對於服務器:

enter image description here

對於客戶端:

enter image description here

我想要的基本上是讓客戶端斷開,只有當服務器關閉或其他事件發生時。但理想情況下,我希望將它連接到服務器以在它們之間交換數據。

有什麼我做錯了嗎?即使服務器上的allowHalfOpen爲true,爲什麼仍然發送FIN包?

感謝,

回答

0

我看到了我的錯誤,我有以下行:

socket.end("hello"); 

在服務器內部的代碼,它本質上殺死了客戶端反正。

相關問題