-2

I am now working on creating simple image server in Android.

This is the server class...

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

and this is the 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;
    }
}

When I tested this code in Android 6.0(Nexus 5), Java.net.SocketException occers when the line //*** called more than twice.

This is the call stack I got.

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)

I also want to imform that this error did not happen when I tested in

  1. Android 4.4.2, 5.0 devices.
  2. Virtual devices (Android 7.0).

I checked the java.net.SocketException issues through the Internet but I could not figure it out what was the cause.

Any advice will be very helpful. Thank you

2 Answers2

0

You can never to thread operations on the main thread. It has to be done async.

So you have two options. Either disable strictmode:

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

Or use an asynctask for the connection too

Zoe
  • 27,060
  • 21
  • 118
  • 148
  • Does that really cause 'connection reset'? – user207421 Sep 06 '17 at 09:52
  • [Most](https://stackoverflow.com/questions/36871636/java-net-socketexception-sendto-failed-econnreset-connection-reset-by-peer) likely yes, though [there are other solutions](https://stackoverflow.com/questions/11207394/getting-socketexception-connection-reset-by-peer-in-android) – Zoe Sep 06 '17 at 09:54
0
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);
}

This is garbage, or at least poorly written and poorly named. read() returns a count, not an index. Try this:

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

If you still get connection resets it is probably because the peer has closed the connection.

user207421
  • 305,947
  • 44
  • 307
  • 483