2011-01-12 8 views
3

私はJavaを使い慣れていないため、HTTPURLConnectionを使用してAndroidで複数の投稿リクエストを送信している間に上記エラーが発生しています。私はsendMessageとrecvMessageメソッドを持っているHTTPTransportクラスを書いています。HTTPUrlConnectionエラー(InputStreamから読み込んだ後でOutputStreamを開くことができません)

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

最初のメッセージは、sendMessageとrecvMessageを使用して正常に送信できます。私は2番目を送信しようとすると、私はこのエラーが表示されます: IOException:java.net.ProtocolException:InputStreamから読み取った後にOutputStreamを開くことができません

このクラスの記述方法を教えてください。

ありがとうございます!

答えて

0

あなたの実装はHTTPUrlConnectiondoes not allow you to reuse the connection in this mannerです。私はあなたが望むようにキープアライブを利用するためにHttpConnectionManagerを使用しなければならないと信じています。

+0

申し訳ありませんが、Javaにはとても新しいので、あなたの回答は理解できませんでした。 – smitten

+0

これは役に立ちますか? http://download.oracle.com/javase/1.5.0/docs/guide/net/http-keepalive.html – dkarp

+0

ありがとう、私はそれを通過します。 – smitten

0

リクエストごとに新しいHttpURLConnectionを使用する必要があります。 TCP接続自体は、バックグラウンドでプールされます。あなた自身でそれをやろうとしないでください。

関連する問題