Android:以UDP / TCP接收数据

时间:2013-02-05 16:24:43

标签: android tcp udp wifi

在我的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函数是否接收()问题?

谢谢!

修改

我用不同的设备测试了代码:UDP在三星Galaxy Tab(Android 3.1)上运行良好,我收到所有数据,但是使用其他设备(Android 4.0)我只收到1/3的数据。

似乎是一个硬件问题......

1 个答案:

答案 0 :(得分:0)

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

  

..提供可靠,有序的八位字节流传输   将一台计算机上的程序转换为另一台计算机上的另一个程序。

Wikipedia - TCP

而UDP:

  

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

Wikipedia - UDP

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

当你在iPhone上试用它时,你确定在幕后没有为你做过某种纠错吗? (我没有iPhone开发经验)