我正在尝试进行在线聊天,但是当我启动代码时,总是得到 java.net.BindException:地址已在使用中(绑定失败)。我尝试过多次更改端口,但始终会遇到相同的异常。有时代码仍然可以执行,并且一切正常,但是异常仍然是我的问题。我知道有些问题与我的类似,但只有Windows用户可以使用,我是Mac用户。这是代码(尚未完全完成,错误发生在服务器部分@ new ServerSocket();
上)
public Server(Client c) {
try {
ServerSocket serverSocket = new ServerSocket(65531);
while (true) {
Socket s = serverSocket.accept();
new Thread() {
@Override
public void run() {
super.run();
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(s.getInputStream()));
String message = bufferedReader.readLine();
System.out.println("Antwort vom Client: " + message);
c.receivedMessage(message);
System.out.println("Adresse: "+s.getInetAddress().toString());
System.out.println(s.getInetAddress().getHostAddress());
s.close();
} catch (Exception e) {
}
}
}.run();
}
} catch (IOException e) {
e.printStackTrace();
}
}
编辑:
我在应用程序运行之前和之后检查了端口,并且仅在运行时使用了端口,因此服务器套接字可以正常工作,但是我仍然遇到异常
答案 0 :(得分:1)
异常 java.net.BindException: Address already in use
试图告诉您Java应用程序正在尝试在特定端口上进行连接,但是该端口已被其他进程使用,并且JVM绑定到该特定端口端口。
您需要找出哪个进程已经在使用该端口并杀死它,然后再尝试连接到套接字。这样可以做到:
以cmd(以管理员身份)输入以下内容:
netstat -ano | findstr :<yourPortNumber>
然后在标识PID后执行以下命令:
taskkill /PID <typeyourPIDhere> /F
再次运行第一个命令,以确保该过程已成功终止。如果先前的操作成功,您将得到一个空行。
了解更多:https://javarevisited.blogspot.com/2011/12/address-already-use-jvm-bind-exception.html#ixzz5pCppM2qn
编辑:以下是在Mac上终止该进程的方法:
netstat -vanp tcp | grep <port number>
如果您使用的是 macOS El Capitan 或 Centos 7 ,请参阅此answer。
答案 1 :(得分:0)
由于先前的程序运行,该端口很可能仍在使用中,并且未正确关闭套接字。因此,在发生错误或运行不完整之后,套接字仍然是打开的,因此使用了端口。
也许您想阅读有关try-with-resource的信息,或者添加一个finally
来确保套接字创建成功就可以关闭它。
确保关闭所有正在运行的Java进程和/或只需重新启动PC即可释放端口。然后编辑代码以正确关闭端口,然后重试。