Java BindException:即使使用唯一端口,地址也已在使用中

Java BindException:即使使用唯一端口,地址也已在使用中,java,linux,eclipse,sockets,port,Java,Linux,Eclipse,Sockets,Port,我昨天问了这个问题,没有人能找出我遇到的问题。所以我希望提供一个更为更新的代码,并添加昨天的建议。基本上,我一直在尝试在服务器和客户机之间建立连接,但每当我先执行服务器,然后执行客户机时,就会出现以下异常:地址已在使用。显而易见的答案是给它一个新端口,但即使这样,我仍然会得到这个错误。我假设这与我的代码出了问题有关。有人能认出它吗?我已经附加了服务器类和客户机类 这是我得到的错误: Exception in thread "main" java.net.BindException: Addres

我昨天问了这个问题,没有人能找出我遇到的问题。所以我希望提供一个更为更新的代码,并添加昨天的建议。基本上,我一直在尝试在服务器和客户机之间建立连接,但每当我先执行服务器,然后执行客户机时,就会出现以下异常:
地址已在使用
。显而易见的答案是给它一个新端口,但即使这样,我仍然会得到这个错误。我假设这与我的代码出了问题有关。有人能认出它吗?我已经附加了服务器类和客户机类

这是我得到的错误:

Exception in thread "main" java.net.BindException: Address already in use
    at java.net.PlainSocketImpl.socketBind(Native Method)
    at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376)
    at java.net.ServerSocket.bind(ServerSocket.java:376)
    at java.net.ServerSocket.<init>(ServerSocket.java:237)
    at java.net.ServerSocket.<init>(ServerSocket.java:128)
    at MessageServer.main(MessageServer.java:16)
客户端代码:

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

public class MessageSendClient {

    public static void man(String args[]) throws IOException {
        String servername = "localhost";
        int port = 53705;
        Socket server;
        //server.setReuseAddress(true);
        try {
            server = new Socket (servername,port);

            System.out.println("Connected to " + server.getInetAddress());
            DataInputStream in = new DataInputStream(new BufferedInputStream(server.getInputStream()));

            server.close();
            byte c[] = new byte[100];
            int num = in.read(c);
            String count = new String(c);

            System.out.println("Server said: " + count);

        } catch (Exception e) { }
    }
}

当服务器程序试图打开端口53705上的套接字进行侦听时,您将收到错误。
地址已在使用
消息意味着,您机器上的另一个进程已在使用端口53705。可能是某个守护进程碰巧打开了这个端口,或者您的web浏览器打开了这个端口,并且仍在使用它

不过,最有可能的情况是,您的服务器程序的另一个实例正在后台某处运行。检查所有终端窗口,或检查IDE中包含运行程序状态的选项卡


顺便说一句,“唯一端口”有点误导,因为端口53705在任何方面都不是“唯一的”,它恰好是您(或某人)选择的一个端口号,您希望它尚未使用。要获得真正唯一的端口,请使用
newserversocket(0)
,这将要求系统分配一个未使用的端口。要找出分配了哪个端口,请使用
serverSocket.getLocalPort()
。您可以将其打印出来,然后将其作为命令行选项传递给客户机程序。

我测试了您的代码,代码运行正常(意思是:我可以连接到服务器,而没有测试其余部分)。请注意MessageSendClient中的main方法,这里有一个输入错误(“man”而不是“main”),正确的签名是:

public static void main(String[] args)
不是

通过执行确保侦听端口是空闲的(用编号替换您的_端口)

因为这就是为什么你会得到这个例外。如果你在Windows上,你可以直接运行

netstat -an

并搜索端口。

我认为您遇到了平台和java库特定的问题。 请提供有关您的操作系统平台(x86/x64)以及您使用哪个供应商提供的jdk版本的其他信息

根据这个链接 Oracle JDK 7u51以上:已更改分配给所有代码(包括不受信任的代码)的默认套接字权限。您只能将套接字绑定到每个系统上的临时端口范围。 端口53705应为保存临时端口。 但仍然使用

netstat -an | grep 53705 
仔细检查该端口是否在linux中使用,并使用netstat或tcpview for windows。 你可以用

less /proc/sys/net/ipv4/ip_local_port_range
让linux检查linux的临时端口范围并查找

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
在windows中获取并确定临时端口范围。有关windows中短暂范围的更多信息,请参见

我可以确认您的服务器代码和客户端在Opensuse 12.3下运行时没有“man”->“main”输入错误,并且

Java version "1.7.0_51"
OpenJDK Runtime Environment (IcedTea 2.4.4) (suse-8.32.5-i386)
OpenJDK Client VM (build 24.45-b08, mixed mode)
jvm is running by an non admin user with groups: www,dialout,video,shadow,users

您需要显示实际的堆栈跟踪,并标识程序中引发异常的语句。@JimGarrison您好,我已经用堆栈跟踪编辑了我的文章。你能看到我的代码哪里出错了吗?你解决了这个问题吗?那会导致安全异常,而不是BindException。你也错误地引用了发行说明。他们说“仍然可以将套接字绑定到临时端口范围…”-1@EJP:感谢您的评论,但新的限制是,绑定临时范围之外的套接字现在需要系统安全策略中的显式权限,这意味着在环境设置时,它是我编程之外的一个附加设置。如果我没有这样做,我仍然无法绑定端口,我是否也得到了由安全异常引起的BindException?还是我错了?谢谢
less /proc/sys/net/ipv4/ip_local_port_range
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Java version "1.7.0_51"
OpenJDK Runtime Environment (IcedTea 2.4.4) (suse-8.32.5-i386)
OpenJDK Client VM (build 24.45-b08, mixed mode)
jvm is running by an non admin user with groups: www,dialout,video,shadow,users