1

大家好,我已经阅读了类似问题的答案,但这些都不能解决我面临的问题。

步骤 1.) 我创建了一个 ServerSocket (localhost port8675) ,我接受了套接字并获得了它对应的 OutputStream (我为此使用了异步任务)

step2.) 我得到的数据块为 byte[] (12kb)。

第 3 步。)我将这个 12kb 字节 [] 写在输出流上。

第一个块写入成功,但是当我尝试写入下一个块时,我遇到了这个错误。

03-27 21:13:00.275 W/System.err(28866): java.net.SocketException: sendto failed: 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;

    }

现在写我得到的字节[]块

  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 ");

几点我只添加了相关代码,dataOutputStream 是一个类成员,套接字接受和输出流写入是在两个单独的异步任务中完成的。

这些是似乎成功的第一次数据写入的日志

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 运行结束

现在第二个数据写入日志是这样的

03-27 21:13:00.275 传入数据长度=12288

03-27 21:13:00.275 doInBackground of server socket start

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 failed: ECONNRESET(连接由对等方重置)

03-27 21:13:00.275 W/System.err(28866): at $writetask.doInBackground(SampleServiceImpl.java:360) // 写入失败

发生这种情况的原因是由于输出流需要以快速间隔写入数据块(我对此表示怀疑,因为我已经在本地套接字上测试了更快的写入速率。)

好心提醒。谢谢

4

0 回答 0