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