0

我写了一个简单的服务器客户端套接字程序,当我重新编译服务器时,我得到:

java.net.BindException: Address already in use: JVM_Bind
    at java.net.DualStackPlainSocketImpl.bind0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketBind(Unknown Source)
    at java.net.AbstractPlainSocketImpl.bind(Unknown Source)
    at java.net.PlainSocketImpl.bind(Unknown Source)
    at java.net.ServerSocket.bind(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)

因此我的问题是如何在 Windows 7 下杀死套接字?是否有可能的解决方案在 Eclipse 中杀死它?

我很欣赏你的回答!!

4

4 回答 4

2

当我遇到它时,杀死 jvm 这解决了这个问题。您是否在停止简单服务器之前关闭代码中的套接字?

于 2012-10-10T13:45:21.693 回答
2

与 RGdev 一样,我假设您仍然有一个 javaw 进程在后台运行,它使连接保持打开状态。但它也可能是您机器上的不同服务器程序,它占用了您要使用的端口。

netstat您可以使用 cmd shell 中的命令找出哪些进程正在侦听哪个端口。以下参数列表 (a) 包括服务器在内的所有连接,(b) 显示打开连接的可执行文件,以及 (n) 禁止用服务名称替换端口号以用于知名端口。

netstat -abn
于 2012-10-10T13:49:46.543 回答
0

这是我的服务器端代码:

import java.io.*;
import java.net.*;

public class ServerSide {


    public static void main(String[] args) {

        try
        {
            ServerSocket myServerSocket = new ServerSocket(9999);
            System.out.println("Server is waiting on host" + InetAddress.getLocalHost().getCanonicalHostName() + "port= "+ myServerSocket.getLocalPort());
            Socket skt = myServerSocket.accept();

            BufferedReader myInput = new BufferedReader(new InputStreamReader(skt.getInputStream()));
            PrintStream myOutput = new PrintStream(skt.getOutputStream());

            String buf = myInput.readLine();
            System.out.println("Server readLine");
            if(buf!=null)
            {
                System.out.println("Buf = " + buf);
                myOutput.print("Got it?");
            }
            else
            {
                System.out.println("Nothing returned in server sidex`x  ");
            }
            skt.close();
            System.out.println("Server shutdown");
        }
        catch(IOException e)
        {
            e.printStackTrace();
            System.out.println("Whooops");
        }
    }

}

正如你所看到的清​​理我写的:

        skt.close();

但也许这不是你的问题,也许你的问题是我 1 小时前遇到的问题;)我曾经运行过一个程序,但结果不是我所期望的,所以我修改它并再次运行它,但端口很忙或已经在采用!我在日食上做什么?在出现错误的控制台下,窗口右侧有红色矩形按钮!它说“终止”。如果您单击该端口,您的端口将是免费的。顺便说一句,不要忘记检查(服务器/客户端)双方的控制台。

于 2012-10-10T13:59:42.823 回答
0

当进程已经终止时,您也可以收到此错误消息。TCP 有一个时间等待状态。此状态用于确保不会将来自旧连接的 TCP 数据包传送到侦听同一端口的新进程。通常你应该使用ServerSocket.setRuseAddress(true)来避免这个问题。

于 2012-10-10T14:33:36.273 回答