2013-04-04 110 views
1

我想在同一臺物理機器上運行同一臺服務器的兩個實例。這兩個服務器將偵聽相同的端口,例如12345.我試圖在127.0.0.1上運行一個服務器,而另一個服務器在127.0.0.2上運行。這兩臺服務器基本上都是使用同一個端口發送和接收消息,但在不同的環回地址上運行。我不知道我是否設置了這個測試環境的正確路徑?不知何故,我無法設置這個測試環境。我正在使用java來開發服務器。使用環回測試環境

+1

我不認爲你將能夠在兩臺服務器綁定到同一端口。你爲什麼想這樣做? – lmsteffan 2013-04-04 22:59:36

+0

我需要這種機制來測試環境。否則,我需要每次嘗試時將程序上傳到物理機器。這將花費很多時間。有一種稱爲回送的機制。我不知道它是否允許多個環回地址使用相同的端口。 – celik 2013-04-04 23:40:05

+0

@lmsteffan並非如此,請參閱我的答案。 – EJP 2013-04-05 01:06:31

回答

1

您可以將兩個服務器綁定到同一端口如果指定了兩種不同的接口:

ServerSocket s1 = new ServerSocket(port, 500, InetAddress.getByName("127.0.0.1")); 
ServerSocket s2 = new ServerSocket(port, 500, InetAddress.getByName("127.0.0.2")); 
+0

@downvoter你需要在一段時間內測試你有缺陷的假設,並對你的知識的不完整狀態做一些事情。我有一個完全這樣的生產環境。四個Tomcats在127.0.0。{1,2,3,4}上運行,全部使用相同的端口。 – EJP 2013-04-05 09:29:49

+0

所以問題是這兩臺服務器可以在環回時使用相同的端口相互通信嗎?這是我的主要問題。我實際上測試他們,你是對的。我能夠在環回上運行兩臺服務器,但它們無法使用相同的端口進行通信。從127.0.0.1:12345發送到127.0.0.2:12345。這沒有奏效。 – celik 2013-04-05 12:24:25

+0

@celik當然,如果他們使用正確的IP:端口連接到對方,他們當然可以。我不明白最後一部分。 127.0.0.1是一個* listen *端口,並且指示一個監聽套接字。你不能隨身攜帶任何東西。你爲什麼想要? – EJP 2013-04-05 18:22:18

1

這正是我的NanoHTTPD叉意爲:

https://github.com/gitgrimbo/nanohttpd/commit/9535d1b6b4c1bbc927d390327018882d84df959f

Added ability to specify hostname to bind to. 

For example: 

java NanoHTTPD -d wwwroot1 -h 127.0.0.1 
java NanoHTTPD -d wwwroot2 -h 127.0.0.2 
java NanoHTTPD -d wwwroot3 -h 127.0.0.3 

And hosts file: 

127.0.0.1 www1.example.com 
127.0.0.2 www2.example.com 
127.0.0.3 www3.example.com 

具體線路225(在上面提交鏈接):

myServerSocket.bind(new InetSocketAddress(hostname, port)); 

此代碼,結合我上面的說明顯示瞭如何在幾個環回地址上運行服務器,所有這些都使用相同的端口(默認爲80,但可以是任何 你的選擇)。

+0

對不起,我沒有檢查過你的程序。這是使用這種機制的例子嗎? – celik 2013-04-05 00:01:35

+0

實際上並沒有回答這個問題。 '是'或'否'會回答它,而不是整個項目的鏈接。 – EJP 2013-04-05 01:09:35

+0

我恭敬地不同意。我的答案可能不像您的答案那麼簡單,但從長遠來看,它可能更有用,作爲「真實世界」的例子。 – 2013-04-05 07:31:09