2013-04-04 146 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