2

在我的 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 的数据。

好像是硬件问题...

4

1 回答 1

0

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

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

维基百科 - TCP

而UDP:

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

维基百科 - UDP

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

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

于 2013-02-05T18:14:59.930 回答