1

こんにちは、私は同様の質問への回答を読みましたが、どれも私が直面している問題を解決できませんでした。

ステップ 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) で // 書き込みに失敗する

これが発生する理由は、出力ストリームが高速な間隔でデータのチャンクを書き込む必要があるためです(ローカルソケットではるかに高速な書き込み速度をテストしたため、疑わしいです)。

親切なアドバイス。ありがとう

4

0 に答える 0