Java网络编程从入门到精通(29):服务端Socket的选项(二)

2014-11-24 00:05:12 · 作者: · 浏览: 1
(这个选项在大多数操作系统上的默认值是false)。而serverSocket2和serverSocket3并不是第一次绑定端口1234,因此,必须设置这两个对象的SO_REUSEADDR值为true。在设置SO_REUSEADDR选项时要注意,必须在ServerSocket对象绑定端口之前设置这个选项。

也许有的读者可能有这样的疑问。如果多个ServerSocket对象同时绑定到一个端口上,那么当客户端向这个端口发出请求时,该由哪个ServerSocket对象来接收客户端请求呢?在给出答案之前,让我们先看看下面的代码的输出结果是什么。


package server;

import java.net.*;

public class TestReuseAddr2 extends Thread
{
String s;
public void run()
{
try
{
ServerSocket serverSocket = new ServerSocket();
serverSocket.setReuseAddress(true);
serverSocket.bind(new InetSocketAddress(1234));
Socket socket = serverSocket.accept();
System.out.println(s + ":" + socket);
socket.close();
serverSocket.close();
}
catch (Exception e)
{
}
}
public TestReuseAddr2(String s)
{
this.s = s;
}
public static void main(String[] args)
{
for (int i = 1; i <= 5; i++)
new TestReuseAddr2("ServerSocket" + i).start();
}
}

执行下面的命令:

java server.TestReuseAddr2


连续执行5次下面的命令:


telnet localhost 1234

执行结果:


ServerSocket1:Socket[addr=/127.0.0.1,port=11724,localport=1234]
ServerSocket3:Socket[addr=/127.0.0.1,port=11725,localport=1234]
ServerSocket5:Socket[addr=/127.0.0.1,port=11726,localport=1234]
ServerSocket2:Socket[addr=/127.0.0.1,port=11727,localport=1234]
ServerSocket4:Socket[addr=/127.0.0.1,port=11728,localport