什么可能导致此套接字找不到端口?

时间:2013-12-04 10:28:56

标签: java sockets udp datagram

我正在尝试创建一个接收UDP数据包并使用UDP消息进行响应的服务器。但是,我似乎无法将其绑定到端口。这是我的类的构造函数:

public UDPServer() throws IOException {
    myGUI = new ServerGUI();
    myClientList = new ArrayList<ClientInfo>();
    DatagramChannel channel = DatagramChannel.open();
    mySocket = channel.socket();

    //mySocket = new DatagramSocket(null);      
    //mySocket.setReuseAddress(true);
    //mySocket.bind(new InetSocketAddress("localhost", Constants.SERVER_PORT_NUM));

    myPortNum = mySocket.getPort();
    myIP = mySocket.getInetAddress();
    System.out.println(myPortNum + "   " + myIP.toString());
}

我已尝试过channel方法和注释掉的方法,我甚至使用此方法尝试找到一个开放端口:

private DatagramSocket createNewSocket() throws IOException {
    for (int i = Constants.MIN_PORT_NUM; i < Constants.MAX_PORT_NUM; i++){
        try {
            System.out.println(i);
            return new DatagramSocket(i);
        } catch (IOException e){
            continue; // try next port
        }
    }

    throw new IOException("No free port found");
}

但到目前为止我没有运气。 portNum始终为-1,IP为null。有什么想法可以在这里发生吗?

编辑:当我在调试模式下运行以下命令并滚动mySocket以查看它包含的值时,它表示:

bound = true
closed = false
connectedAddress = null
connectedPort = -1

但是当我运行mySocket.getLocalPort()时,它会返回一个有效的端口号。这是怎么回事?

以下是代码:

public UDPServer() throws IOException {
    myGUI = new ServerGUI();
    myClientList = new ArrayList<ClientInfo>();

    mySocket = new DatagramSocket(Constants.SERVER_PORT_NUM);
    mySocket.setReuseAddress(true);

    myPortNum = mySocket.getLocalPort();
    myIP = mySocket.getInetAddress();
    System.out.println(mySocket);
}

1 个答案:

答案 0 :(得分:0)

您不需要这样做。只需使用非args构造函数创建它,或指定端口零。系统将为您分配一个免费端口。