IOException Stream closed
843841Jun 4 2003 — edited Jun 12 2003I have a problem with a servlet that receives XML, it will work sometimes but no all. It will read the XML once, sometimes twice but never a third!! its running on Tomcat 3.3 under Apache 1.3.2.7 I have tried all combinations of flush and close the output/input stream. The problem appears to be the servlet, but I close the input.
Has anyone else come across this problem?
Here is some code and the exceptions I get.
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import java.text.*;
public class RecXml extends HttpServlet implements SingleThreadModel {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
// Send an HTTP 500 error
res.sendError(500);
}
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
System.out.println("Method = "+req.getMethod());
System.out.println("Length = "+req.getIntHeader("Content-length"));
System.out.println("Method = "+req.getHeader("Content-type"));
System.out.println("Encoding = "+req.getHeader("Content-transfer-encoding"));
String messageFromClient = getMessageFromClient(req);
System.out.println("Message = "+messageFromClient);
res.setStatus(res.SC_OK);
return;
}
public String getMessageFromClient(HttpServletRequest req) throws IOException {
BufferedReader bufferedReader;
StringBuffer message = new StringBuffer();
bufferedReader = req.getReader();
char[] b = new char[512];
int numberOfCharsRead = 0;
while ((numberOfCharsRead = bufferedReader.read(b, 0, b.length)) != -1) {
message.append(b, 0, numberOfCharsRead);
}
bufferedReader.close();
return message.toString();
}
}
import java.net.*;
import java.io.*;
import java.util.*;
public class Client {
public static void main(String[] args) throws Exception {
if (args.length < 2) {
System.out.println("Usage: java Client URL Filename");
}
else {
try {
URL url = new URL(args[0]);
String document = args[1];
FileReader fr = new FileReader(document);
char[] buffer = new char[1024*10];
int bytes_read = 0;
if ((bytes_read = fr.read(buffer)) != -1)
{
URLConnection urlc = url.openConnection();
urlc.setRequestProperty("Content-Type","text/xml");
urlc.setDoOutput(true);
urlc.setDoInput(true);
PrintWriter pw = new PrintWriter(urlc.getOutputStream());
// send xml to jsp
pw.write(buffer, 0, bytes_read);
pw.close();
BufferedReader in = new BufferedReader(new InputStreamReader(urlc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}
java.io.IOException: Stream closed
at java.io.BufferedReader.ensureOpen(BufferedReader.java:95)
at java.io.BufferedReader.read(BufferedReader.java:248)
at RecXml.getMessageFromClient(RecXml.java:52)
at RecXml.doPost(RecXml.java:25)
at javax.servlet.http.HttpServlet.service(HttpServlet.java)
at javax.servlet.http.HttpServlet.service(HttpServlet.java)
at
org.apache.tomcat.facade.ServletHandler.doService(ServletHandler.java:481)
at org.apache.tomcat.core.Handler.invoke(Handler.java:322)
at org.apache.tomcat.core.Handler.service(Handler.java:235)
at
org.apache.tomcat.facade.ServletHandler.service(ServletHandler.java:432)
at
org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:91
7)
at
org.apache.tomcat.core.ContextManager.service(ContextManager.java:833)
at
org.apache.tomcat.modules.server.Ajp12Interceptor.processConnection(Ajp12Int
erceptor.java:207)
at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:477)
at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.jav
a:519)
at java.lang.Thread.run(Thread.java:479)
help appreciated, thanks.