我有一些类似于此的java代码:
private void startServer() throws IOException {
URLClassLoader classloader = null;
System.out.println("Opening server socket for listening on " + PORT_NUMBER);
try {
server = new ServerSocket(PORT_NUMBER);
server.setSoTimeout(10000);
connected = true;
System.out.println("Server is now listening on port " + PORT_NUMBER);
} catch (IOException e) {
System.err.println("Could not start server on port " + PORT_NUMBER);
e.printStackTrace();
connected = false;
}
while (connected) {
// Incoming request handler socket.
Socket socket = null;
try {
System.out.println("Waiting for client connection...");
// Block waiting for an incoming connection.
socket = server.accept();
if (socket == null) continue;...and等等。当我稍后调用server.close()时(如果首先调用socket.close(),我不会得到任何不同的行为),我不会收到任何错误,但是netstat显示端口仍然在被监听。调用ServerSocket.close()是否足以释放该系统上的端口?
我正在为Java1.4.2微版本运行时编程。同样值得注意的是,我在另一个线程中运行了这个方法,并且我正在尝试从它的父线程关闭套接字。
编辑这里是来自netstat的行,尽管我可以向您保证它仍然在被监听,因为如果我再次启动Xlet,我会得到端口号的异常。
tcp 0 0 *.2349 *.* LISTEN发布于 2011-07-21 00:14:59
有几件事要考虑。其中之一由JavaDoc of ServerSocket的下列引文描述
公共空setReuseAddress(布尔值on)抛出SocketException
启用/禁用SO_REUSEADDR套接字选项。当TCP连接关闭时,连接可能在连接关闭后一段时间内保持超时状态(通常称为TIME_WAIT状态或2 2MSL等待状态)。对于使用众所周知的套接字地址或端口的应用程序,如果存在涉及套接字地址或端口的超时状态的连接,则可能无法将套接字绑定到所需的SocketAddress。
因此,操作系统仍然可以显示在您close()服务器套接字之后发生了一些事情,这是可以的。但是,如果要频繁地打开/关闭同一端口上的服务器套接字,则可能会遇到问题。
https://stackoverflow.com/questions/6769934
复制相似问题