3 votes

Erreur HTTPUrlConnection (Can't open OutputStream after reading from an inputStream)

Je suis nouveau en Java et je rencontre l'erreur mentionnée ci-dessus lors de l'utilisation de HTTPURLConnection pour envoyer des requêtes multiples sur Android. J'ai écrit une classe HTTPTransport dans laquelle j'aimerais avoir des méthodes sendMessage et recvMessage.

public class HTTPTransport
{
   private HttpURLConnection connection;

   public HTTPTransport()
   {
      URL url = new URL("http://test.com");

      connection = (HttpURLConnection) url.openConnection(); 
      connection.setRequestMethod("POST"); 
      connection.setDoInput(true); 
      connection.setDoOutput(true); 
      connection.setRequestProperty("Content-Type", "application/octet-stream");
      connection.setRequestProperty("Accept-Encoding", "gzip");
      connection.setRequestProperty("Connection", "Keep-Alive");
   }

   public void sendMessage(byte[] msgBuffer, long size)
   {
      try
      {
         DataOutputStream dos = new DataOutputStream(connection.getOutputStream());
         dos.write(msgBuffer, 0, (int)size); 
         dos.flush();
         dos.close();

         dos.close();
      }
      catch( IOException e )
      {
         // This exception gets triggered with the message mentioned in the title.
         Log.e(TAG, "IOException: " + e.toString());
      }
   }
   public byte[] recvMessage()
   {

      int readBufLen = 1024;

      byte[] buffer = new byte[readBufLen];

      int len = 0;
      FileOutputStream fos = new FileOutputStream(new File("/sdcard/output.raw"));

      DataInputStream dis = new DataInputStream(connection.getInputStream());
      while((len = dis.read(buffer, 0, readBufLen)) > 0) 
      {
         Log.d(TAG, "Len of recd bytes " + len + ", Byte 0 = " + buffer[0]);
         //Save response to a file
         fos.write(buffer, 0, len);
      }

      fos.close();
      dis.close();
      return RecdMessage;      
   }
}

Je peux envoyer le premier message avec succès en utilisant sendMessage et recvMessage. Lorsque j'essaie d'envoyer le deuxième message, je vois cette erreur : IOException : java.net.ProtocolException : can't open OutputStream after reading from an inputStream

Veuillez me faire savoir comment je peux écrire cette classe.

Merci de votre attention !

0voto

dkarp Points 6864

Votre mise en œuvre de HTTPUrlConnection ne permet pas de réutiliser la connexion de cette manière . Je pense que vous devrez utiliser un HttpConnectionManager pour utiliser Keep-Alive comme vous le souhaitez.

0voto

EJP Points 113412

Vous devez utiliser une nouvelle connexion HttpURLConnection pour chaque demande. La connexion TCP elle-même sera mise en commun dans les coulisses. N'essayez pas de le faire vous-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X