【发布时间】:2013-01-20 15:37:46
【问题描述】:
在我的 Android 应用程序中,我必须从 Wifi 连接(UDP 和 TCP)获取数据。
这是我的 UDP 代码:
try {
// Create new UDP-Socket
socket = new DatagramSocket(SERVERPORT);
while (isRunning) {
byte[] buf = new byte[50];
DatagramPacket packet = new DatagramPacket(buf,
buf.length);
socket.receive(packet);
String str = new String(buf, 0, packet.getLength());
packet.setLength(buf.length);
Message msg = handler.obtainMessage();
Bundle b = new Bundle();
b.putString("getStr", str);
msg.setData(b);
handler.sendMessage(msg);
}
对于 TCP:
try {
s = new Socket(SERVERIP, SERVERPORT);
BufferedReader in = new BufferedReader(
new InputStreamReader(s.getInputStream()));
while (!s.isClosed()) {
String strTcp = in.readLine().toString();
Message msg = handler.obtainMessage();
Bundle b = new Bundle();
b.putString("getStr", strTcp + "\n");
msg.setData(b);
handler.sendMessage(msg);
}
它工作正常,但我的问题是:
我的 Wifi 设备发送一个数据序列(总是相同的字符串序列),当我在 TCP 中收到 1250 个字符串时,我在 UDP 中只收到 400 个字符串。 UDP 通常不是比 TCP 工作得快吗?
我在 iPhone 上尝试了相同的测试,它工作正常,UDP 获得的值与 TCP 一样多。
那么问题是什么?是阻塞 UDP 函数 receive() 的问题吗?
谢谢!
编辑
我用不同的设备测试了代码:UDP 在三星 Galaxy Tab (Android 3.1) 上运行良好,我接收所有数据,但在其他设备 (Android 4.0) 上我只接收 1/3 的数据。
好像是硬件问题...
【问题讨论】:
-
如果您要使用 UDP 而不是 TCP,您需要自己实现 TCP 提供而 UDP 不提供的一切所需。很可能,这种情况下的主要问题是您没有实现transmit pacing, congestion control, and exponential backoff。
-
当将字节转换为字符串,将字符串转换为字节时,应使用 Charset 示例 - new String(text,Charset.defaultCharset());也许这就是问题所在?您应该在两边使用相同的字符集。另一件事,可能是用于发送字符串的代码中的字符串切割,您可以将您的代码发布到发送端吗?
-
"当我在 TCP 中接收到 1250 个字符串时,我在 UDP 中只接收到 400 个字符串。UDP 通常工作速度不是比 TCP 快吗?"是,对的。但是通过 UDP 发送并不能保证接收方可以 100% 正确接收。在这种情况下,TCP 应该比 UDP 接收更好。理解?这就是为什么许多 UDP 数据包丢失的原因。实际上并不依赖于移动硬件。