Android设备(Galaxy note 2除外)无法获取UDP数据包

时间:2014-01-28 11:08:27

标签: java android sockets

我正在开发一个客户端服务器应用程序,其中服务器(用Java编写的桌面程序)通过UDP将屏幕截图发送到同一无线网络中的我的Android设备。当然,由于数据报大小大于udp标准大小(65 K),我正在创建它们的片段并使用UDP将循环发送到我的Android设备。

我的问题是它在Samsung Galaxy Note 2(android 4.2.2)上运行完美,但在其他Android设备中无效(甚至运行相同Android版本的设备对于ex galaxy tab 3,galaxy Note 1)。代码卡在socket.receive(数据报)上,甚至不接收单个数据包。

有人可以帮我这个吗?

public ClientListener(int port, int fps, AppDelegate del){
        delegate = del;
        framesPerSecond = fps;

        try{

            serverAddr = getLocalIpAddress();
            dgp = new DatagramPacket(buf, buf.length);

        }catch (Exception e){
            Log.e("ClientActivity", "C: Error", e);
        }
        serverPort = port;
    }



    public void run() {
           try {
               socket = new DatagramSocket(serverPort, serverAddr);
               connected = true;

               Timer timer = new Timer();
               int frames = 1000/framesPerSecond;

               Log.e("FRAMES", ""+frames);
               timer.scheduleAtFixedRate(getImageTask, 0, frames);

               listen();               
           }
           catch (Exception e) {
               Log.e("ClientActivity", "Client Connection Error", e);
           }
     }



private void listen()
    {

        while(connected){

            try{

                socket.receive(dgp); //gets stuck here on devices other than note 2




                byte[] data = dgp.getData();
                System.out.println("data received in datagram clientListener====="+data);
            /* Read header infomation */
            short session = (short) (data[1] & 0xff);
            short slices = (short) (data[2] & 0xff);
            int maxPacketSize = (int) ((data[3] & 0xff) << 8 | (data[4] & 0xff)); // mask

            short slice = (short) (data[5] & 0xff);
            int size = (int) ((data[6] & 0xff) << 8 | (data[7] & 0xff)); // mask



                System.out.println("------------- PACKET -------------");
                System.out.println("SESSION_START = "
                        + ((data[0] & SESSION_START) == SESSION_START));
                System.out.println("SSESSION_END = "
                        + ((data[0] & SESSION_END) == SESSION_END));
                System.out.println("SESSION NR = " + session);
                System.out.println("SLICES = " + slices);
                System.out.println("MAX PACKET SIZE = " + maxPacketSize);
                System.out.println("SLICE NR = " + slice);
                System.out.println("SIZE = " + size);
                System.out.println("------------- PACKET -------------\n");


            /* If SESSION_START falg is set, setup start values */
            if ((data[0] & SESSION_START) == SESSION_START) {
                if (session != currentSession) {
                    currentSession = session;
                    slicesStored = 0;
                    /* Consturct a appropreately sized byte array */
                    imageData = new byte[slices * maxPacketSize];
                    slicesCol = new int[slices];
                    sessionAvailable = true;
                }
            }

            /* If package belogs to current session */
            if (sessionAvailable && session == currentSession) {
                if (slicesCol != null && slicesCol[slice] == 0) {
                    slicesCol[slice] = 1;
                    System.arraycopy(data, HEADER_SIZE, imageData, slice
                            * maxPacketSize, size);
                    slicesStored++;
                }
            }

            /* If image is complete dispay it */
            if (slicesStored == slices) {
                ByteArrayInputStream bis = new ByteArrayInputStream(
                        imageData);
                 Bitmap bp=BitmapFactory.decodeStream(bis);
                         delegate.getController().setImage(bp);




                         Log.e("Testing", "Received image");






            }

1 个答案:

答案 0 :(得分:0)

对不起家伙我的愚蠢。实际上由于一些奇怪的原因,服务器无法同时满足来自多个Android设备的多个连接。只应将一个设备连接到服务器或请求连接。在我的情况下,我已经登录了我的笔记2并且同时尝试使用其他设备。所以我的其他设备无法接收数据包。