发送和接收数据报包
Send and receive datagram packet
抱歉我的英语不好。我必须使用 android 上的蓝牙平移接口从 phone 向无线电发送和接收数据。这是我实现发送的代码,我已经将它放入 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)
{
}
但是有3个问题:
1. 我需要在 192.168.11.2 和 1234 端口接收数据包,但是当我声明 datagramsocket 时我将其设置为无效,因为如果我输入端口和地址,发送代码不起作用;
2. 如何管理电台收到的数据包?我不需要使用地址和端口字节;
3. 为什么我把超时放在循环之前?
感谢您的回答。
1) 仅使用您需要的端口号创建数据报套接字。 DatagramSocket(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 秒后如果 receive() 没有读取任何内容,它将超时。每个连接只需设置一次,不应在循环期间多次设置。
希望对您有所帮助
抱歉我的英语不好。我必须使用 android 上的蓝牙平移接口从 phone 向无线电发送和接收数据。这是我实现发送的代码,我已经将它放入 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)
{
}
但是有3个问题: 1. 我需要在 192.168.11.2 和 1234 端口接收数据包,但是当我声明 datagramsocket 时我将其设置为无效,因为如果我输入端口和地址,发送代码不起作用; 2. 如何管理电台收到的数据包?我不需要使用地址和端口字节; 3. 为什么我把超时放在循环之前?
感谢您的回答。
1) 仅使用您需要的端口号创建数据报套接字。 DatagramSocket(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 秒后如果 receive() 没有读取任何内容,它将超时。每个连接只需设置一次,不应在循环期间多次设置。
希望对您有所帮助