Java Socket编程启动服务端/客户端报JVM_Bind端口占用错误求解决
错误原因
java.net.BindException: Address already in use: JVM_Bind 报错的核心原因是你代码中使用的2020端口已经被其他进程占用,常见场景包括:
- 之前运行的Server进程没有正常关闭,残留在后台占用端口
- 同一时间启动了多个Server实例,重复绑定同一个端口
- 上次程序运行结束后端口处于TIME_WAIT状态,暂时无法重新绑定
你提到Client运行也报相同错误,大概率是你误启动了多个Server实例,或者之前的Server进程没有关闭,Client本身的逻辑是连接端口而非绑定端口,正常不会触发该报错。
修复方案
第一步:清理占用2020端口的进程
根据你使用的操作系统执行对应操作:
- Windows系统:
- 按下Win+R输入cmd打开命令提示符
- 执行命令
netstat -ano | findstr :2020,查询结果最后一列就是占用端口的进程PID - 执行命令
taskkill /PID 你查询到的PID /F,强制结束该进程
- Mac/Linux系统:
- 打开终端
- 执行命令
lsof -i:2020,查询结果中PID列就是占用端口的进程ID - 执行命令
kill -9 你查询到的PID,强制结束该进程
你也可以直接打开IDEA的运行控制台,把所有已经启动的Server、Client进程全部点停止按钮关闭,也能清理残留进程。
第二步:优化代码避免后续重复出现问题
你当前的Server代码存在两个缺陷,很容易触发端口占用问题,按如下修改即可:
- 新增端口复用配置,避免TIME_WAIT状态导致绑定失败
- 程序运行结束后主动关闭ServerSocket,释放端口
修改后的Server构造方法代码如下:
public Server() throws IOException { ServerSocket server_socket = new ServerSocket(); // 开启端口复用,解决短时间内重启服务绑定失败的问题 server_socket.setReuseAddress(true); server_socket.bind(new java.net.InetSocketAddress(2020));//绑定2020端口 System.out.println("port 2020 has been opened!"); Socket socket=server_socket.accept(); System.out.println("Client "+socket.getInetAddress()+" has connected"); BufferedReader in_socket=new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out_socket=new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true); out_socket.println("Welcome");//send "welcome" to client String message=in_socket.readLine(); System.out.println("Client says "+message); // 先后关闭客户端连接、服务端Socket,彻底释放端口 socket.close(); server_socket.close(); System.out.println("Socket is closed"); }
第三步:按正确顺序运行程序
- 先运行Server类,等待控制台打印
port 2020 has been opened!,说明服务端启动成功 - 再运行Client类,即可正常完成通信
内容的提问来源于stack exchange,提问作者tecs-x
相关产品推荐
相关产品推荐

