0

TCP ソケット経由でローカル サブネット上のサーバーにデータ (floats と int) を送信する Android リアルタイム データ アプリを開発しています。私が直面している問題は、いくつかのデータを同時に送信した後、ソケットがデータをまったく送信しないことです。アプリをデバッグしたところ、データが送信されていることが示されていますが、サーバーには表示されません。これが発生した後、接続を閉じると、設計モデルによると、サーバーは接続が終了したという通知さえ受け取りません。その間、壊れたパイプに書き込めないという例外がアプリで発生します。これは、問題がアプリにあることを示しています。これは、デスクトップ アプリを使用してテストしたこともあり、膨大な量のデータをサーバーに送信して配信できるためです。

ここで話しているデータ サイズは、1 パケットあたり252 バイトであることに注意してください。

これが私が使用している私のクラスです。(これはAsyncTaskオブジェクトで実行されます)

    public class Network
{
    private Socket handle;
    public static enum TASK
    {
        TASK_CONNECT, TASK_SEND, TASK_CLOSE 
    }
    public Network()
    {

    }
    public String lastError = "";
    public boolean Connect(String host, int port)
    {
        try
        {
            lastError = "Connecting to server.";
            handle = new Socket(host, port);

            handle.setTcpNoDelay(true); //                         
            handle.setSendBufferSize(SIZE_OF_PACKET);  ///==> These don't seem to help at all
            handle.setKeepAlive(true); ///                          

            return true;
        }catch(IOException e)
        {
            lastError += e.getMessage() != null ? " "+ e.getMessage() : "";
            return false;
        }
    }
    private void err(String e){
        System.err.println(e);
    }

    private boolean SendPacket(byte buffer[])
    {
        OutputStream oStream = null;
        err("sending: " + buffer.length + " bytes");

        try
        {
            lastError = "Obtaining output stream.";
            oStream = handle.getOutputStream();

            lastError = "Error sending data.";
            oStream.write(buffer);

            oStream.flush();

            return true;
        }catch(Exception e)
        {
            lastError += e.getMessage() != null ? " "+ e.getMessage() : "";
        }
        return false;
    }

    public void Close()
    {
        try{ handle.close(); handle = null; }catch(Exception e){} // swallow exception
    }
}

持っている数字の数に応じて、ループでデータを送信します。Google 検索を試みましたが、関連するものが見つかりませんでした。誰もこれを経験したことがありますか?それは今私を怒らせています。

編集: Wireshark は、デスクトップ アプリ (サーバー) に到達しない着信 "赤" パケットを示します。この画像を見てください。 ここに画像の説明を入力 最初のいくつかはLen > 0で、赤いものは 0 です。

私は、Google が USB をインターフェース化して、私たちが使用できるようにする時が来たと思います。少なくともそれが私の最初の選択肢だったでしょう。

4

2 に答える 2

0

Ok。代わりにUDPを使用して問題を解決しました。皆さん、ありがとうございました。しかし、私はまだ問題の原因を見つけていません。

于 2013-05-06T06:06:52.610 に答える
0

oStream.close()ストリームを二度と使用しないことを考えると、ストリームをフラッシュした後に呼び出すべきではありませんか?

また、これはオブジェクトで実行されていると言いAsyncTaskます。複数のスレッドが同時にパケットを送信しようとしている可能性はありますか? その場合、メソッドの周りで何らかの形式の同期が必要になる場合がありますSendPacket

于 2013-05-05T12:59:45.650 に答える