Ben*_*est 1 java sockets serversocket
我有一些看起来与此类似的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;
Run Code Online (Sandbox Code Playgroud)
...等等等等.当我稍后调用server.close()时(如果我先调用socket.close(),我没有得到任何不同的行为),我没有得到任何错误,但是netstat显示端口仍在被监听.应该调用ServerSocket.close()是否足以释放此系统上的端口?
我正在为Java 1.4.2微创运行时编程.值得注意的是,我有这个方法在另一个线程中运行,我试图从其父线程关闭套接字.
编辑这是来自netstat的行,虽然我可以向你保证它仍在被监听,因为如果我再次启动Xlet,我会得到一个带有该端口号的异常.
tcp 0 0 *.2349 *.* LISTEN
Run Code Online (Sandbox Code Playgroud)
有几件事需要考虑.其中一个由来自ServerSocket的JavaDoc的以下引用描述
public void setReuseAddress(boolean on)抛出SocketException
启用/禁用SO_REUSEADDR套接字选项.当TCP连接关闭时,连接可能在连接关闭后的一段时间内保持超时状态(通常称为TIME_WAIT状态或2MSL等待状态).对于使用众所周知的套接字地址或端口的应用程序,如果在涉及套接字地址或端口的超时状态中存在连接,则可能无法将套接字绑定到所需的SocketAddress.
因此,操作系统仍然可以显示close()服务器套接字后发生了某些事情.但是如果要经常打开/关闭同一端口上的服务器套接字,可能会出现问题.
| 归档时间: |
|
| 查看次数: |
2619 次 |
| 最近记录: |