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 は Samsung 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 に答える