【问题标题】:Android Datagram Sockets not workingAndroid数据报套接字不起作用
【发布时间】:2013-09-29 22:32:26
【问题描述】:

我正在尝试在 Android 中实现基本的数据报套接字。我从网络上的一个示例开始:

String messageStr="Hello Android!";
int server_port = 54372;
try {
  DatagramSocket s = new DatagramSocket();
  InetAddress local = null;
  local = InetAddress.getByName("192.168.100.127");
  int msg_length=messageStr.length();
  byte[] message = messageStr.getBytes();
  DatagramPacket p = new DatagramPacket(message, msg_length, local, server_port);
  s.send(p);
} catch (SocketException e) {
  e.printStackTrace();
} catch (UnknownHostException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}

我已经在 AndroidManifest.xml 中启用了 INTERNET 权限:

<uses-permission android:name="android.permission.INTERNET"/>

程序在遇到s.send(p) 命令时终止。

我错过了什么?这一定很明显。

【问题讨论】:

  • 您应该发布来自 logcat 的消息,该消息在它“死”时发生

标签: android sockets udp datagram


【解决方案1】:

您遇到了一个您没有发现的错误:NetworkOnMainThreadException。 您应该在另一个 Thread 或 AsyncTask 中执行所有网络人员。

例如:

class MyThread extends Thread
{
    @Override
    public void run()
    {
        UDPSend();
    }

    void UDPSend()
    {
        String messageStr = "Hello Android!";
        int server_port = 54372;
        try
        {
            DatagramSocket s = new DatagramSocket();
            InetAddress local = null;
            local = InetAddress.getByName("192.168.1.57");
            int msg_length = messageStr.length();
            byte[] message = messageStr.getBytes();
            DatagramPacket p = new DatagramPacket(message, msg_length, local, server_port);
            s.send(p);
            android.util.Log.w("UDP", "Works fine!");
        }
        catch (SocketException e)
        {
            e.printStackTrace();
        }
        catch (UnknownHostException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        catch (Exception e)
        {
            android.util.Log.w("UDP", "Catched here.");
            e.printStackTrace();
        }
    }

}

在你的主线程中执行线程:new MyThread().start();

更新:

异步任务中的 UDP 接收器: 这是一个应用程序的真实示例。我删除了一些不相关的行。 我向你展示 doInBackgroud,它接收 UDP 数据包。

@Override
protected Void doInBackground(Void... urls)
{
    DatagramSocket socketUDP;

    try
    {
        socketUDP = new DatagramSocket(5050);
        socketUDP.setSoTimeout(5000);

        // set it to true if you want to receive broadcast packets
        socketUDP.setBroadcast(false); 
    }
    catch (Exception e)
    {
        e.printStackTrace();
        return null;
    }

    byte[] buff = new byte[512];
    DatagramPacket packet = new DatagramPacket(buff, buff.length);
    try
    {
        asyncTask_UDP_is_running=true;
        // Keep running until application gets inactive
        while (aplicationActive)
        {
            try
            {
                socketUDP.receive(packet);
                android.util.Log.w("UDP", "got a packet");
            }
            catch (java.net.SocketTimeoutException ex)
            {
                // timeout
            }
            catch (Exception e)
            {
                e.printStackTrace();
                return null; 
            }
        }
    }
    finally
    {
        asyncTask_UDP_is_running=false;
    }
    return null;
}

}

【讨论】:

  • 我已经在这样做了。我只是包含了看起来相关的代码的 sn-p。
  • @DanDickerson 那么它应该可以工作,它对我有用。我只是将您的代码复制到我的工作区中,将 IP 更改为我的 IP 网络并在 UI 中运行它,它触发了一个异常,我将它放在 Thread 中并且工作正常。可能是IP的问题,尝试使用回环IP127.0.0.1看看是否有效。
  • 我终于得到了你的建议。你现在能帮我让听众工作吗?我尝试设置与您的示例类似的另一个类 GetThread,但它似乎并没有真正接收到 UDP 消息。
  • @DanDickerson:如果您使用模拟器接收 UDP 数据包,请在此站点中搜索“模拟器接收 UDP 数据包”之类的内容。您需要重定向一些端口。
  • 不,我使用的是三星 Galaxy Tab 3。
猜你喜欢
  • 2017-08-17
  • 2014-01-14
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多