【问题标题】:Send and receive datagram packet发送和接收数据报包
【发布时间】:2015-01-13 01:23:40
【问题描述】:

抱歉我的英语不好。我必须使用 android 上的蓝牙 pan 接口从手机向收音机发送和接收数据。这是我实现发送的代码,我已经将其放入 AsyncTask 的函数 DoInBackground() 中:

 try
           {

            ds = new DatagramSocket();
            byte buf[] = "Ciao".getBytes();
            DatagramPacket msg = new DatagramPacket(buf, buf.length, InetAddress.getByName(add), p);

            ds.send(msg);

        }

而且效果很好。现在我要等100秒收音机的回答。我决定用这段代码来实现它:

try
       {
           ds.setSoTimeout(10000);

           while(true)
           {
               try
               {
                   ds.receive(dp);
               }
               catch (IOException e)
               {
                   e.printStackTrace();
               }
           }



       }
       catch (IOException e)
       {

       }

但是有三个问题: 1.我需要在192.168.11.2和1234端口接收数据包,但是当我声明datagramsocket时我将它设置为void,因为如果我输入端口和地址,发送代码不起作用; 2. 对讲机收到的数据包如何管理?我不需要使用地址和端口字节; 3. 为什么我把timeout放在loop之前?

感谢您的回答。

【问题讨论】:

    标签: android sockets bluetooth


    【解决方案1】:

    1) 仅使用您要使用的端口号创建数据报套接字。数据报套接字(p);

    2) 您有一个 DatagramPacket,其中包含响应大小和响应长度的字节缓冲区,即:

    int responseLength = 1024;
    byte[] responseData = new byte[responseLength];
    DatagramPacket response = new DatagramPacket(responseData, responseLength);
    

    在接收到这个数据报包之后,你需要将它转换成它被发送的相同对象。可能是这样的:

    String s = new String(response.getData());
    

    3) setSoTimeout 不会导致消息等待 100 秒,它只是说在 100 秒后如果接收()没有读取任何内容,那么它将超时。每个连接只需要设置一次,不应在循环期间设置多次。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 2012-10-03
      • 2012-05-20
      • 2011-05-30
      • 2013-08-28
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多