【问题标题】:Exception : java.net.BindException: Cannot assign requested address异常:java.net.BindException:无法分配请求的地址
【发布时间】:2013-11-24 08:30:59
【问题描述】:

我想发送和接收数据报套接字,但出现异常java.net.BindException: Cannot assign requested address。我传递了我要通信的服务器的正确 IP 地址和正确的端口号。

try {
    SocketAddress sockaddr = new InetSocketAddress("203.100.77.54", 8000);
    DatagramSocket sock = new DatagramSocket(sockaddr);
    DatagramPacket pack = new DatagramPacket(bData, bData.length);
    sock.send(pack);
} catch (FileNotFoundException fnfe) {
    Log.e(LOG_TAG, "FileNotFoundException");
} catch (SocketException se) {
    Log.e(LOG_TAG, "SocketException");
} catch (UnknownHostException uhe) {
    Log.e(LOG_TAG, "UnknownHostException");
} catch (IOException ie) {
    Log.e(LOG_TAG, "IOException");
}

请帮帮我。

【问题讨论】:

    标签: java android


    【解决方案1】:

    DatagramSockets 不是使用目标地址创建的。它们是使用自己的本地绑定地址创建的,或者没有,这会在第一次使用时导致默认绑定。目标地址在构造DatagramPacket时指定,或者在connect()方法中指定。

    【讨论】:

    • 为什么?我写的哪一部分你不明白?
    【解决方案2】:

    这样试试

     String messageStr = "Hello Android!";
     int server_port = 8000;
     DatagramSocket s = new DatagramSocket();
     InetAddress local = InetAddress.getByName("203.100.77.54");
     int msg_length = messageStr.length();
     byte[] message = messageStr.getBytes();
     DatagramPacket p = new DatagramPacket(message, msg_length, local, server_port);
     s.send(p);
    

    【讨论】:

    • 试试看,为什么?仅仅代码不是答案。你必须解释。
    【解决方案3】:

    这是一个更高级的答案:

    直接 UDP 与直接 TCP 一样,适用于特定地址,例如 Bob。因此,如果我将数据包发送给 Bob,那么您将无法收听它们——您只能自己收听。因此,如果您尝试为 Bob 打开一个侦听器,您的设备会告诉您不允许。

    除非您使用多播 UDP 或类似的东西,否则您只能收听直接发送给您的内容,因此 IP 或任何地址必须是该设备自己的地址。

    【讨论】:

      猜你喜欢
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2016-06-23
      相关资源
      最近更新 更多