java Socket的选项
来源:互联网 发布:软件开发企业税收优惠 编辑:程序博客网 时间:2024/06/05 14:40
SO_REUSEADDR选项决定了一个端口是否可以被绑定多次。可以通过SeverSocket类的两个方法(setReuseAddres和getReuseAddress)来设置和获得SO_TIMEOUT选项的值,这两个方法的定义如下:
public void setReuseAddress(boolean on) throws SocketException
public boolean getReuseAddress() throws SocketException
在大多数操作系统中都不允许一个端口被多次绑定。如果一个ServerSocket对象绑定了已经被占用的端口,那么ServerSocket的构造方法或bind方法就会抛出一个BindException异常。
Java提供这个选项的主要目的是为了防止由于频繁绑定释放一个固定端口而使系统无法正常工作。当ServerSocket对象关闭后,如果ServerSocket对象中仍然有未处理的数据,那么它所绑定的端口可能在一段时间内不会被释放。这就会造成其他的ServerSocket对象无法绑定这个端口。在设置这个选项时,如果某个端口是第一次被绑定,无需调用setReuseAddress方法,而再次绑定这个端口时,必须使用setReuseAddress方法将这个选项设为true。而且这个方法必须在调用bind方法之前调用。下面的代码演示了如何设置和获得这个选项的值:
package server;
import java.net.*;
public class TestReuseAddr1
{
public static void main(String[] args) throws Exception
{
ServerSocket serverSocket1 = new ServerSocket(1234);
System.out.println(serverSocket1.getReuseAddress());
ServerSocket serverSocket2 = new ServerSocket();
serverSocket2.setReuseAddress(true);
serverSocket2.bind(new InetSocketAddress(1234));
ServerSocket serverSocket3 = new ServerSocket();
serverSocket3.setReuseAddress(true);
serverSocket3.bind(new InetSocketAddress(1234));
}
}
运行结果:false
在上面代码中第一次绑定端口1234,因此,serverSocket1对象无需设置SO_REUSEADDR选项(这个选项在大多数操作系统上的默认值是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 Socket的选项
- socket的选项
- 服务端Socket的选项
- 服务端Socket的选项
- [Java]Java Socket选项解析
- 几个重要的TCP/IP选项解析(Java Socket)
- java网络编程Socket中SO_LINGER选项的用法解读
- Java网络编程(29):服务端Socket的选项
- 几个重要的TCP/IP选项解析(Java Socket)
- 几个重要的TCP/IP选项解析(Java Socket)
- java网络编程Socket中SO_LINGER选项的用法解读
- Java Socket 几个重要的TCP/IP选项解析(一)
- Java Socket 几个重要的TCP/IP选项解析(二)
- java网络编程Socket中SO_LINGER选项的用法解读
- Java Socket 几个重要的TCP/IP选项解析
- Java Socket 几个重要的TCP/IP选项解析(一)
- Java Socket 几个重要的TCP/IP选项解析(二)
- 几个重要的TCP/IP选项解析(Java Socket)
- Windows通信端口初始化失败
- android手机或者平板重力感应器描述
- 重新理解“复数”
- 第10周 hadoop与关系型数据库交换数据
- 算法经典书籍推荐
- java Socket的选项
- 挨踢职场求生法则-----我在IT职场打滚超过15年了,从小小的程序员做到常务副总
- .NET月薪10K的王同学:把面试官当作中意的妞,想办法取悦他!
- 解决linux下"bash:shutdown:command not found"的解决方法
- css中选择器总结
- Transformations between ECEF and ENU coordinates
- 小强的HTML5移动开发之路(25)—— AppCan开发环境
- UVA 11468-Substring(AC自动机+概率dp)
- c/c++ 调用QuickTime API中的细节问题