こんにちは、私は同様の質問への回答を読みましたが、どれも私が直面している問題を解決できませんでした。
ステップ 1.) ServerSocket (localhost ポート 8675) を作成し、ソケットを受け入れ、対応する OutputStream を取得します (これには非同期タスクを使用します)。
step2.) データのチャンクを byte[] (12kb) として取得します。
ステップ 3.) この 12kb バイト [] を出力ストリームに書き込みます。
最初のチャンクの書き込みは成功しましたが、次のチャンクを書き込もうとすると、このエラーに直面します。
03-27 21:13:00.275 W/System.err(28866): java.net.SocketException: sendto に失敗しました: ECONNRESET (ピアによる接続のリセット)
03-27 21:13:00.275 W/System.err (28866): libcore.io.IoBridge.maybeThrowAfterSendto (IoBridge.java:506) で
03-27 21:13:00.275 W/System.err (28866): libcore.io.IoBridge.sendto (IoBridge.java:475) で
03-27 21:13:00.275 W/System.err(28866): java.net.PlainSocketImpl.write (PlainSocketImpl.java:507) で
03-27 21:13:00.275 W/System.err(28866): java.net.PlainSocketImpl.access$100 (PlainSocketImpl.java:46) で
03-27 21:13:00.275 W/System.err(28866): java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:269) で
これらは、サーバーソケットを作成し、出力ストリームを取得するためのコードブロック非同期タスクです
protected Void doInBackground(Void... arg0) {
// TODO Auto-generated method stub
try {
providerSocket = new ServerSocket(8765);
Log.d(TAG," ServerSocket made ");
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e(TAG,"ServerSocket failed ");
e.printStackTrace();
}
//Wait for connection
Log.d(TAG,"Waiting for connection");
try {
connection = providerSocket.accept();
Log.d(TAG,"Connection received from " + connection.getInetAddress().getHostName());
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e(TAG,"ServerSocket accept failed ");
e.printStackTrace();
}
try {
dataOutputStream = connection.getOutputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
dataOutputStream.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
今、私が得る byte[] チャンクを書くために
Log.i(TAG, "incoming data of length ="+data.length);
new writetask().execute(data);
protected Void doInBackground(byte[]... temp) {
// TODO Auto-generated method stub
if(temp[0] != null && (temp[0].length > 0 )){
Log.d(TAG,"doInBackground of server socket start queued data len"+temp[0].length);
mBuffer = new byte[temp[0].length];
mBuffer = temp[0];
}
else
{ Log.e(TAG,"empty buffer enqued :(");
return null ;
}
try {
if(mBuffer != null)
{
Log.d(TAG, " buffer size = "+temp[0].length);
Log.d(TAG," write buffer to socket");
dataOutputStream.write(mBuffer,0,mBuffer.length);} // LINE NO 360.
else
Log.e(TAG, "no buffers are recieved yet");
mBuffer = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Log.d(TAG,"enqeueBuffer flush the socket");
dataOutputStream.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d(TAG,"doInBackground run end ");
関連するコードのみを追加したいくつかのポイント。
これらは、成功したと思われる最初のデータ書き込みのログです
03-27 21:13:00.150: 長さ =12288 の着信データ
03-27 21:13:00.155 : サーバーソケット開始の doInBackground
03-27 21:13:00.155 サーバー ソケットの doInBackground 開始キュー データ len12288
03-27 21:13:00.155 バッファ サイズ = 12288
03-27 21:13:00.155 ソケットにバッファを書き込みます 03-27 21:13:00.160 ソケットをフラッシュします
03-27 21:13:00.160 doInBackground 実行終了
2 回目のデータ書き込みログは次のとおりです。
03-27 21:13:00.275 長さ =12288 の着信データ
03-27 21:13:00.275 サーバー ソケットの doInBackground 開始
03-27 21:13:00.275 サーバー ソケットの doInBackground 開始キュー データ len12288
03-27 21:13:00.275 バッファ サイズ = 12288
03-27 21:13:00.275 ソケットへの書き込みバッファ
03-27 21:13:00.275 W/System.err(28866): java.net.SocketException: sendto に失敗しました: ECONNRESET (ピアによる接続のリセット)
03-27 21:13:00.275 W/System.err(28866): $writetask.doInBackground(SampleServiceImpl.java:360) で // 書き込みに失敗する
これが発生する理由は、出力ストリームが高速な間隔でデータのチャンクを書き込む必要があるためです(ローカルソケットではるかに高速な書き込み速度をテストしたため、疑わしいです)。
親切なアドバイス。ありがとう