UPD数据包没有到达三星Galaxy Tab 7.7,但它们到达了HTC Desire

时间:2012-07-06 08:26:08

标签: android sockets udp datagram

我正在开发Android 3.1平板电脑应用程序。

我将使用此应用程序收听由设备发送的UDP数据包,该设备每5秒发送一次UDP报文到255.255.255.255:8001。

使用桌面程序Docklight scripting v1.9我看到这个设备每5秒发送一个11字节的数据包,我的应用程序没有收到每个数据包:有时收到一个,有时收到5或6个数据包在同一时间。

这是我的活动:

public class UDPSocketActivity extends Activity
{
    private UDPServerThread myThread;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        int ipAddress = wifiInfo.getIpAddress();

        TextView txt = (TextView)findViewById(R.id.deviceIP);
        txt.setText(Integer.toString(ipAddress));
    }

    public void onStartClick(View view)
    {
        Log.v("UDPSocketActivity", "onClick");

        try
        {
            myThread = new UDPServerThread("X", 8001);
            myThread.start();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

这是UDP套接字线程:

public class UDPServerThread extends Thread
{
    private static final int MESSAGE_SIZE = 11;
    protected DatagramSocket socket = null;
    protected boolean end = false;

    public UDPServerThread(String serverName, int port) throws IOException
    {
        super(serverName);

        Log.v("UDPServerThread", "constructor");

        socket = new DatagramSocket(port);
        socket.setBroadcast(true);
    }

    public void run()
    {
        while (!end)
        {
            try
            {
                byte[] buf = new byte[MESSAGE_SIZE];

                // Wait an incoming message.
                DatagramPacket packet = new DatagramPacket(buf, buf.length);

                Log.v("UDServerThread", "Listenning...");

                socket.receive(packet);

                Log.v("UDServerThread", "Mensaje recibido.");
            }
            catch (IOException e)
            {
                if (!socket.isClosed())
                    e.printStackTrace();
            }
        }
    }

    public void stopServer()
    {
        Log.v("UDPServerThread", "stopServer");
        if (socket != null)
            socket.close();
        end = true;
    }
}

这是AndroidManifest.xml权限:

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

更新
如果我将UDP数据包发送到平板电脑的IP,例如UDP:192.168.1.135:8001,有时它会收到数据包。有时它会同时收到三个或四个。

但是,如果我将直接UDP数据包发送到 HTC Desire 2.2.2 ,它会收到所有这些数据包,但我的HTC不接收广播数据包。我使用相同的代码。

这是我如何接收UDP广播包(看时间):

07-06 12:08:56.580: V/UDServerThread(6449): Mensaje recibido.
07-06 12:08:59.655: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:02.410: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:03.230: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:03.435: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:03.745: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:03.945: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:04.460: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:04.770: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:04.975: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:46.855: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:06.005: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:06.310: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:06.515: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:06.825: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:07.335: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:07.640: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:07.845: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:10.415: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:17.065: V/UDServerThread(6449): Mensaje recibido.

我做错了什么?也许我需要一些自定义配置。

顺便说一下,我正在使用Android 3.1在三星Galaxy Tab 7.7上进行测试。

3 个答案:

答案 0 :(得分:0)

如果您想确保收到所有发送数据包,则应使用TCP协议而不是UDP。

答案 1 :(得分:0)

要在HTC上接收广播,您需要获得Wifi多播锁定。基本上一些制造商默认禁用接收多播。仍然不知道你的平板电脑上发生了什么,可能是中间的某种缓冲或缓慢的网络设备?

WifiManager wifi;
wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
MulticastLock ml = wifi.createMulticastLock("just some tag text");
ml.acquire();

When the asynctask stops I do a 
ml.release();

Code from Android Issues Tracker

答案 2 :(得分:0)

我的路由器出现问题。

注意:我回答我自己的问题,因为我认为这对其他有相同问题的人有用(我在四天之内处理它)。