【问题标题】:udp6 CLOSE when programming android udp serverudp6 在编写 android udp 服务器时关闭
【发布时间】:2012-04-27 03:37:25
【问题描述】:

我正在 Android 4.0 (api 15) 中编写 UDP 服务器 程序 当程序启动时,我无法连接到 android 中的 UDP 服务器

环境

virtualbox, android x84 4.0, ping to/from virtualbox-android are ok,

UDP 服务器代码

DatagramSocket ds = new DatagramSocket(9101);
<uses-permission android:name="android.permission.INTERNET" />

android 中的 netstat 显示

udp6    0    0    :::9101    :::*    CLOSE

如何制作普通的 IPv4 UDP 监听套接字?

【问题讨论】:

    标签: android udp virtualbox ipv6


    【解决方案1】:

    试试

    DatagramSocket ds = new DatagramSocket(9101, InetAddress.getByName("192.168.1.1"));
    

    看看能不能解决。你也可以先创建socket,然后再绑定,比如:

    DatagramSocket ds = new DatagramSocket(null);
    ds.bind(new InetSocketAddress("192.168.1.1", 9101));
    

    【讨论】:

      【解决方案2】:

      你不能在主线程中接收或做网络流量。

      您必须创建一个单独的可运行线程来执行此操作:

      new Thread(new Runnable() {
          public void run() {
          try {
                 if (clientsocket == null) {
              clientsocket = new DatagramSocket(null);
                  clientsocket.bind(new InetSocketAddress("0.0.0.0", 1337));
              clientsocket.setBroadcast(true);
             }
                 byte[] receivedata = new byte[1024];
             while (true) {
              DatagramPacket recv_packet = new DatagramPacket(
              receivedata, receivedata.length);
              clientsocket.receive(recv_packet);
                  alertMessage = new String(recv_packet.getData());
              InetAddress ipaddress = recv_packet.getAddress();
              int port = recv_packet.getPort();
              String msg = "RECEIVED UDP MSG FROM " + ipaddress.toString() + ":" + Integer.toString(port) + " :" + alertMessage;  Log.d("UDP", msg);
              myHandler.post(alertMsg);
              }
          } catch (Exception e) {
              Log.e("UDP", "S: Error", e);
          }
            }
      }).start();
      

      然后在一个单独的类中编写可能干扰主 UI 的可运行任务。

      final Runnable alertMsg = new Runnable() {
          public void run() {
              Toast.makeText(getApplicationContext(), alertMessage, Toast.LENGTH_LONG).show();
          }
      };
      

      【讨论】:

        猜你喜欢
        • 2011-01-22
        • 2019-03-26
        • 2011-09-11
        • 2015-06-16
        • 1970-01-01
        • 2011-04-29
        • 1970-01-01
        • 2012-10-23
        • 2015-11-30
        相关资源
        最近更新 更多