【问题标题】:java.net.SocketException in Android AsyncTaskAndroid AsyncTask 中的 java.net.SocketException
【发布时间】:2018-02-14 18:00:05
【问题描述】:

我现在正致力于创建简单的 Android 中的图像服务器。

这是服务器类...

new Thread(new Runnable()
{
    public void run()
    {
        try
        {
            ServerSocket serverSocket = new ServerSocket(8080);

            while(true)
            {
                Socket client = serverSocket.accept();

                SimpleImageSender sender
                    = new SimpleImageSender(client);
                sender.execute();
            }
        }

        catch(Exception e)
        {
            e.printStackTrace();
        }    
    }
}).start();

这是 AsyncTask。

public class SimpleImageSender extends HttpGetForMapTileHandler<Void,Void,Void>
{
    protected Socket client;

    public SimpleImageSender(Socket socket)
    {
        super();
        this.client = socket;
    }

    @Override
    protected Void doInBackground(Void... params)
    {
        try
        {
            URL url = new URL("http://www.imageFromWeb.png");
            HttpURLConnection httpCon = (HttpURLConnection)url.openConnection();
            httpCon.setRequestMethod("GET");
            httpCon.connect();

            if(httpCon.getResponseCode() == 200)
            {
                DataOutputStream out = new DataOutputStream(this.client.getOutputStream());
                byte response[] = new byte[BUFFER_SIZE];
                int index = httpCon.getInputStream().read(response,0,BUFFER_SIZE);
                while(index != -1)
                {
                    out.write(response,0,index);//***
                    index = httpCon.getInputStream().read(response,0,BUFFER_SIZE);
                }

                out.flush();
            }
            else
            {
                Log.d("AAA","No png");
            }
        }

        catch(Exception e)
        {

            e.printStackTrace();
            cancel(true);
        }

        return null;
    }
}

当我在 Android 6.0(Nexus 5) 中测试此代码时,Java.net.SocketException 当线路//*** 调用超过两次时发生。

这是我得到的调用堆栈。

09-06 18:03:42.763 20730-22167/com.example.SimpleImageSenderServer 
W/System.err: java.net.SocketException: sendto failed: ECONNRESET 
 (Connection reset by peer)
09-06 18:03:42.763 20730-22167/com.example.SimpleImageSenderServer 
W/System.err:     at 
libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:542)
09-06 18:03:42.763 20730-22167/com.example.SimpleImageSenderServer 
W/System.err:     at libcore.io.IoBridge.sendto(IoBridge.java:511)
09-06 18:03:42.764 20730-22167/com.example.SimpleImageSenderServer 
W/System.err:     at 
java.net.PlainSocketImpl.write(PlainSocketImpl.java:500)
09-06 18:03:42.764 20730-22167/com.example.SimpleImageSenderServer 
W/System.err:     at java.net.PlainSocketImpl.-
wrap1(PlainSocketImpl.java)
09-06 18:03:42.764 20730-22167/com.example.SimpleImageSenderServer 
W/System.err:     at
java.net.PlainSocketImpl$PlainSocketOutputStream.
write(PlainSocketImpl.java:266)
09-06 18:03:42.764 20730-22167/com.example.SimpleImageSenderServer 
W/System.err:     at 
java.io.DataOutputStream.write(DataOutputStream.java:98)
09-06 18:03:42.765 20730-22167/com.example.SimpleImageSenderServer 
W/System.err:     at 
com.example.SimpleImageSenderServer.
SimpleImageSender.doInBackground(SimpleImageSender.java:xx)

我还想告知我在测试时没有发生此错误

  1. Android 4.4.2、5.0 设备。
  2. 虚拟设备 (Android 7.0)。

我通过以下方式检查了 java.net.SocketException 问题 互联网,但我想不通 是什么原因。

任何建议都会很有帮助。 谢谢

【问题讨论】:

    标签: android sockets android-asynctask serversocket


    【解决方案1】:

    你永远不能在主线程上进行线程操作。它必须异步完成。

    所以你有两个选择。要么禁用严格模式:

    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }
    

    或者也使用异步任务进行连接

    【讨论】:

    【解决方案2】:
    int index = httpCon.getInputStream().read(response,0,BUFFER_SIZE);
    while(index != -1)
    {
        out.write(response,0,index);//***
        index = httpCon.getInputStream().read(response,0,BUFFER_SIZE);
    }
    

    这是垃圾,或者至少写得不好,名字也不好。 read() 返回计数,而不是索引。试试这个:

    int count;
    while((count = httpCon.getInputStream().read(response)) > 0)
    {
        out.write(response,0,count);
    }
    // The following are completey missing from your code
    out.close();
    httpCon.getInputStream().close();
    

    如果你仍然得到连接重置,那可能是因为对端已经关闭了连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 2014-12-18
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多