2017-09-06 2 views
-2

Ich arbeite jetzt an der Erstellung einfacher Image Server in Android.java.net.SocketException in Android AsyncTask

Dies ist die Server-Klasse ...

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

und dies ist der 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; 
    } 
} 

Wenn ich diesen Code in Android getestet 6.0 (Nexus 5), java.net.SocketException occers, wenn die Leitung //*** mehr genannt als doppelt so hoch.

Dies ist der Call-Stack, den ich bekam.

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) 

Ich möchte auch imform, dass dieser Fehler nicht passiert, wenn ich in

getestet
  1. Android 4.4.2, 5.0-Geräte.
  2. Virtuelle Geräte (Android 7.0).

überprüfte ich die java.net.SocketException Probleme durch das Internet, aber ich konnte es nicht herausfinden, was die Ursache war.

Jeder Rat wird sehr hilfreich sein. Vielen Dank

Antwort

0

Sie können nie Operationen auf dem Hauptthread zu fädeln. Es muss async gemacht werden.

Sie haben also zwei Möglichkeiten. Entweder deaktivieren StrictMode:

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

oder verwenden Sie eine AsyncTask für die Verbindung zu

+0

Führt das wirklich zum "Verbindungszurücksetzen"? – EJP

+0

[Most] (https://stackoverflow.com/questions/36871636/java-net-socketexception-sendto-failed-econnreset-connection-reset-by-peer) wahrscheinlich ja, obwohl [es gibt andere Lösungen] (https: //stackoverflow.com/questions/11207394/getting-socketexception-connection-reset-by-peer-in-android) – Zoe

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

Das ist Müll, oder zumindest schlecht geschrieben und schlecht benannt. read() gibt einen Zähler zurück, keinen Index. Versuchen Sie dies:

Wenn Sie immer noch Verbindung zurückgesetzt wird, ist es wahrscheinlich, weil der Peer die Verbindung geschlossen hat.