执行下面的命令:
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=1234]
上面的运行结果只是一种可能,如果多次按着上面的步骤操作,可能得到不同的运行结果。由此可以断定,当多个ServerSocket对象同时绑定一个端口时,系统会随机选择一个ServerSocket对象来接收客户端请求。但要注意,这个接收客户端请求的ServerSocket对象必须关闭(如019行如示),才能轮到其他的ServerSocket对象接收客户端请求。如果不关闭这个ServerSocket对象,那么其他的ServerSocket对象将永远无法接收客户端请求。读者可以将 serverSocket.close()去掉,再执行上面操作步骤,看看会有什么结果。
三、SO_RCVBUF选项
可以通过SeverSocket类的两个方法(setReceiveBufferSize和getReceiveBufferSize)来设置和获得SO_RCVBUF选项的值,这两个方法的定义如下:
public synchronized void setReceiveBufferSize (int size) throws SocketException
public synchronized int getReceiveBufferSize() throws SocketException
其中size参数表示接收缓冲区的大小,单位是字节。设置了ServerSocket类的SO_RCVBUF选项,就相当于设置了Socket对象的接收缓冲区大小。这个Socket对象是由accept返回的。下面积代码演示了如何使用这两个方法来设置和获得接收缓冲区的大小:
package server;
import java.net.*;
public class TestReceiveBufferSize
{
public static void main(String[] args) throws Exception
{
ServerSocket serverSocket = new ServerSocket(1234);
serverSocket.setReceiveBufferSize(2048); // 将接收缓冲区设为2K
while (true)
{
Socket socket = serverSocket.accept();
// 如果客户端请求使用的是本地IP地址,重新将Socket对象的接
// 收缓冲区设为1K
if (socket.getInetAddress().isLoopbackAddress())
socket.setReceiveBufferSize(1024);
System.out.println("serverSocket:"
+ serverSocket.getReceiveBufferSize());
System.out.println("socket:" + socket.getReceiveBufferSize());
socket.close();
}
}
}
执行如下命令:
java server.TestReceiveBufferSize
执行如下三个命令 (192.168.18.100为本机IP地址):
telnet 192.168.18.100 1234
telnet localhost 1234
telnet 192.168.18.100 1234
运行结果:
serverSocket:2048
socket:2048
serverSocket:2048
socket:1024
serverSocket:2048
socket:2048
从上面的运行结果可以看出,在执行telnet localhost 1234命令后,由于localhost是本地地址,因此程序通过将Socket对象的接收缓冲区设为1024,而在执行其他两条命令后,由于192.168.18.100不是本机地址,所以Socket对象的接收缓冲区仍然保留着 |