Sockets Java 7没有';使用ServerSocket绑定已使用的端口时不会引发BindException
我正在Windows7x64上用Java在ServerSocket上进行实验。 我编写了一个小程序,在端口8080上托管一个HTTP服务器,只返回一个静态HTML响应,其中包含类加载器的toString() 我在节目中所做的主要是:Sockets Java 7没有';使用ServerSocket绑定已使用的端口时不会引发BindException,sockets,jvm,java,serversocket,Sockets,Jvm,Java,Serversocket,我正在Windows7x64上用Java在ServerSocket上进行实验。 我编写了一个小程序,在端口8080上托管一个HTTP服务器,只返回一个静态HTML响应,其中包含类加载器的toString() 我在节目中所做的主要是: 创建服务器套接字 在serverSocket上调用setReuseAddress(false) 将端口8080绑定到此套接字 使用永久循环接受套接字并给出响应 首先,我尝试了JRE 1.6.023,一切都很好:第一个实例启动并正常响应,第二个实例无法启动,因为引发了
Exception in thread "main" java.net.BindException: Address already in use: JVM_Bind
当我尝试使用JRE 1.7.0_5时,发生了意想不到的事情:两个实例都可以成功启动,但只有第一个实例给出响应。第一个实例被杀死后,第二个实例开始响应
我是否做错了什么,或者这是JRE 7的一个bug
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class TestServerSocket {
private static final String HEADER = "HTTP/1.1 200 OK\r\n" + "Content-type: text/html\r\n"
+ "Connection: close\r\n" + "\r\n";
private static final int PORT = 8080;
private static void handle(Socket socket) {
System.out.println(socket.getInetAddress() + ":" + socket.getPort());
StringBuilder buffer = new StringBuilder();
buffer.append(HEADER);
buffer.append(TestServerSocket.class.getClassLoader());
try {
socket.getOutputStream().write(buffer.toString().getBytes());
} catch (IOException e) {
} finally {
try {
socket.close();
} catch (IOException e) {
}
}
}
public static void main(String[] args) throws IOException {
int port;
try {
port = Integer.parseInt(args[0]);
} catch (Exception e) {
port = PORT;
}
final ServerSocket server = new ServerSocket();
server.setReuseAddress(false);
server.bind(new InetSocketAddress(port));
// Terminator thread, stop when Ctrl-D is entered
new Thread() {
public void run() {
try {
while (System.in.read() != 4);
} catch (IOException e) {
e.printStackTrace();
}
try {
server.close();
} catch (IOException e) {
}
System.exit(0);
}
}.start();
System.out.println("Listening on: " + port);
Socket client = null;
while (true) {
try {
client = server.accept();
handle(client);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
为了隔离问题,我建议您运行以下测试代码。 . 它是标准API,在这个特定示例中使用ServerSocket,因此它在您的环境(java 7)中失败的可能性很小
若它失败了,你们肯定知道问题不在于你们的代码。同时,我将在我的工作机器上的JDK 7上尝试您的代码,并将进行更新。也许您可以向我们展示您的代码?+1如果没有代码,就不可能找到源代码error@carlspring如您所愿。ElementalHttpServer在使用构造函数
ServerSocket(int-port)
时可以正常工作。我使用构造函数ServerSocket()
并使用bind()
方法指定端口。然后我尝试在我的代码中用bind(…)
交换setReuseAddress(false)
,现在它在JRE 7中运行良好。但是,我是否遗漏了提到bind()
和setReuseAddress()
顺序很重要的文档?这是我的错,因为setReuseAddress()
上的文档提到:绑定套接字后启用或禁用SO\u REUSEADDR的行为(请参见isBound())没有定义。