【问题标题】:Android : Receive data in UDP/TCPAndroid:以 UDP/TCP 接收数据
【发布时间】: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 数据包丢失的原因。实际上并不依赖于移动硬件。

标签: android tcp udp wifi


【解决方案1】:

TCP和UDP的主要区别在于TCP是:

.. 提供可靠、有序的八位字节流从一个 将一台计算机上的程序转移到另一台计算机上的另一个程序。

Wikipedia - TCP

而 UDP:

.. 使用协议最少的简单传输模型 机制。1它没有握手对话,因此暴露了任何 底层网络协议对用户的不可靠性 程序。由于这通常是基于不可靠媒体的 IP,因此没有 交货、订购或重复保护的保证。

Wikipedia - UDP

换句话说,如果您使用 UDP/数据报套接字,您必须自己实现握手/纠错。我还注意到在您的代码中,您为接收数据报套接字分配了一个大小为 50 的缓冲区。如果套接字接收到溢出缓冲区的数据,它将简单地返回一个 50 字节的完整缓冲区并忽略其余部分;溢出的数据会丢失。

当您在 iPhone 上尝试它时,您确定没有在幕后为您进行某种纠错吗? (我没有 iPhone 开发经验)

【讨论】:

  • 我用 100 和 200 的大小进行了测试:结果相同。这是接收到的字符串的格式: $--data*checksum$--data*checksum... 可以 de receive() 函数剪切在第一个 并忽略其余数据?
  • 据我所知 socket.receive() 不歧视。发送的就是你得到的,除非缓冲区溢出。
猜你喜欢
  • 1970-01-01
  • 2010-12-09
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
相关资源
最近更新 更多