我正在使用套接字在Java上构建一个简单的客户端/服务器程序。我已经按照几个教程创建了一个简单的客户端/服务器程序,这个程序让我走得很远,但是当我尝试运行我的服务器类时,当我输入某些端口并且什么也不做,或者使用其他一些端口时,它会冻结给我异常“java.net.BindException:Address in in use:JVM_Bind”。
以下是我的服务器类的一些关键部分;
public void start() throws IOException {
isRunning = true;
serverSocket = new ServerSocket(getPort());
while (isRunning) {
try {
clientConnection();
setupStreams();
} catch (IOException ex) {
addOutput("Connection unsuccessful.");
System.out.println(ex);
System.exit(1);
}
}
}
private void clientConnection() throws IOException {
addOutput("Listening for client...");
socket = serverSocket.accept();
addOutput("Connection successful."); // print out username which connected
}
private void setupStreams() throws IOException {
serverIn = new ObjectInputStream(socket.getInputStream());
serverOut = new ObjectOutputStream(socket.getOutputStream());
}
private void btnConnectActionPerformed(ActionEvent evt) {
if (evt.getSource() == this.btnConnect) {
try {
start();
} catch (IOException ex) {
System.out.println(ex);
}
}
}
就像我说的那样,我已经按照教程进行了比较,如果我做了什么与他们相比没什么差别,但是我遇到了问题而我的服务器什么也没做,冻结,或者给出了异常。
有什么想法吗?
答案 0 :(得分:2)
java.net.BindException: Address already in use: JVM_Bind
当您尝试使用已经在使用的端口号运行程序时,会发生,这可能是系统上的其他程序或其他程序实例已经冻结"。
至于冻结,
socket = serverSocket.accept();
将等待客户端与此套接字建立连接。如果没有另一个程序作为客户端运行,那么这个程序将会冻结"等待一个。
答案 1 :(得分:1)
我改变了我的代码,似乎解决了问题。主要的解决方法是在构造函数中设置服务器,似乎已经修复了它。虽然,我仍然不明白为什么我以前做的方式不起作用。但是,它现在有效。
答案 2 :(得分:0)
仅当服务器/ tomcat使用同一端口时,才会出现上述错误。
在Mac上,请使用以下命令:
I514W:~ skumar$ lsof -i :8082
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 45270 skumar47 411u IPv6 0x34323c1bdd54744d 0t0 TCP *:us-cli
(LISTEN)
I514W:~ skumar$ kill 45270
第一个(lsof -i:8082)将列出在该端口上运行的进程。第二个(杀死45270)将终止进程,端口将是免费的。重新启动tomcat或使用该端口的任何其他进程后,它将起作用。