【发布时间】:2016-03-14 17:38:29
【问题描述】:
提前感谢任何支持,
我正在尝试在本地网络上广播 UDP 消息。发送特定字符串后,响应者会发回有关其位置、IP 地址、状态等的元数据。
我已经进行了通信,但问题在于字符串响应本身。
TLDR: 我的 udp 接收数据包正在切断数据报的 front 元素。
我认为这不是缓冲区大小问题。我的 buff 是 2048,比我希望接收的数据大得多(大约 50-200 个字符)。
我之前曾使用过此设置,并且第一部分没有问题(使用 iOS)。一个wireshark(等效)控制台也证实了这一点。已附上 Wireshark 和 Android 输出以供比较。
Proper data coming in via packet app
Front-truncated packet in logcat(注意“[Red]”之前的所有内容都被省略了)
onCreate 内部:
try{
socket = new DatagramSocket();
socket.setBroadcast(true);
socket.setSoTimeout(3000);
broadcastPacket = new DatagramPacket(
broadcastString.getBytes(),
broadcastString.length(),
getBroadcastAddress(),
30303);
}catch (IOException e) {
Log.e("MYAPP", "socket error", e);
}
在 AsyncTask 中:
try {
while(true) {
byte[] buffer = new byte[2048];
DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
socket.receive(receivePacket);
String receiveString = new String(receivePacket.getData(), 0, receivePacket.getLength() );
Log.d("a", "Received response " + receiveString );
Log.d("a", "From host " + receivePacket.getAddress() );
Log.d("a", "With offset " + receivePacket.getOffset() );
}
}catch (java.io.IOException e) {
Log.d("a", "Receive timed out");
}
请注意,在使用 receivePacket.getLength() 之前,我只会在部分响应之后得到一堆 ?
【问题讨论】:
-
向我们展示您的代码。我敢打赌,您正在使用某种 readline 并自己切断除最后一行之外的所有内容 - 请注意您是如何在最后一个换行符之后开始的。
-
'我的 udp 接收数据包正在切断数据报的前面元素' 我敢打赌我的电影收藏你错了,你自己的代码/数据只是搞砸了。
-
@MartinJames,里面有什么好看的电影吗?
-
@SergeyA 我有几十年前的 DVD 等,还有一些“真正的卷轴”。
-
@MartinJames 感谢您的评论。我包含了通过具有相同发现字符串、广播 IP 和端口的wireshark 返回的正确数据。我已经在 iOS 上完成了这项工作。如果我的代码有误,请您提交解决方案吗?
标签: android sockets networking udp