【问题标题】:Android UDP ClientAndroid UDP 客户端
【发布时间】:2015-12-29 20:57:32
【问题描述】:

所以我为 android 制作了一个简单的 UDP 客户端,但由于某种原因它不想工作。我已经为此苦苦挣扎了 5 个小时,但我找不到问题所在。我什至查看了互联网上几乎所有的教程,比较代码,但我没有运气。

String serverString = "192.168.1.109";
int port = 7777;

Log.d("adam", "Debug");

DatagramSocket socket = null ;

String msg = "Hello World!";

try {
    socket = new DatagramSocket() ;

    InetAddress host = InetAddress.getByName(serverString);
    byte [] data = msg.getBytes() ;
    DatagramPacket packet = new DatagramPacket( data, data.length, host, port );
    Log.d("adam", "Debug2");

    socket.send(packet) ;

    Log.d("adam", "Packet sent" );
} catch( Exception e )
{
    Log.d("adam", "Exception");
    Log.e("adam", Log.getStackTraceString(e));
}
finally
{
    if( socket != null ) {
        socket.close();
    }
}

我的主要节日:

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

这里是调试图:

如您所见,“数据包已发送”文本不在 logcat 中。所以问题可能出在send() 函数上。知道可能是什么问题吗?

【问题讨论】:

  • 默认情况下不允许主线程上的网络。有特殊功能可以改变这种行为。您可以通过StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); 禁用该严格模式
  • 嗯,我现在知道了。刚刚在android上发现了一个网络问题的线程。他们在那里有相同的解决方案:D 我对其进行了测试并且工作正常。 (链接:stackoverflow.com/questions/16439587/…)这是解决此问题的最简单方法吗?感谢您的帮助。 :) 抱歉打开这个帖子,但我整天忙于解决这个问题,我坚持我永远不会找出问题所在。
  • 最好避免在生产应用程序的 Android 主 (UI) 线程上执行任何 I/O。阻塞的套接字调用将导致应用程序响应能力差。使用 AsyncTask 或专用线程来实现您的客户端协议。

标签: javascript android sockets udp udpclient


【解决方案1】:

永远不要在主线程上运行网络。不要做 Mark 建议的工作。

当您发送数据时,您应该使用 ASyncTAsk 或线程。

这是一个非常简单的线程函数:

Thread sendDate = new Thread() {
@Override
public void run() {
    String serverString = "192.168.1.109";
    int port = 7777;

    Log.d("adam", "Debug");

    DatagramSocket socket = null ;

    String msg = "Hello World!";

    try {
        socket = new DatagramSocket() ;

        InetAddress host = InetAddress.getByName(serverString);
        byte [] data = msg.getBytes() ;
        DatagramPacket packet = new DatagramPacket( data, data.length, host, port );
        Log.d("adam", "Debug2");

        socket.send(packet) ;

        Log.d("adam", "Packet sent" );
    } catch( Exception e )
    {
        Log.d("adam", "Exception");
        Log.e("adam", Log.getStackTraceString(e));
    }
    finally
    {
        if( socket != null ) {
            socket.close();
        }
    }
    }
};
sendDate.start(); 

如果您想告诉用户数据是否已发送,那么您应该使用 ASyncTask

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 2016-10-07
    • 2012-12-18
    • 1970-01-01
    • 2012-09-07
    • 2013-04-21
    • 2011-09-30
    • 2012-01-06
    相关资源
    最近更新 更多