You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-dev@xerces.apache.org by Aleksander Slominski <as...@cs.indiana.edu> on 2002/05/01 06:15:12 UTC

Re: Problems with Xerces SAX parser closing my socket?!?!?!

hi,

you will need to wrap input stream to prevent xerces from succeeding
in closing input stream - as you suspect the parse is calling close()
effectively closing both halves of TCP socket stream

see http://xml.apache.org/xerces-j/faq-write.html#faq-11
which describes how to prevent stream closing:

hope it helps,

alek

Michael Frumin wrote:

> Hello,
>         I'm writing an application in Java that is using the xerces SAX
> parser to parse incoming requests and I'm encountering a problem where,
> after the client writes all of its requests and does a TCP half-close,
> the parser returns but the socket that the parser is reading from (via
> an InputSource created off the socket) seems to be closed, even for
> output.  Writes to the socket after the parse() function returns
> generate the following exception:
>
> java.io.IOException: Bad file descriptor
>         at java.net.SocketOutputStream.socketWrite(Native Method)
>         at java.net.SocketOutputStream.write(SocketOutputStream.java:71)
>
> If anyone else has encountered this problem, and maybe has a solution,
> please let me know.
>
> [Following is a more detailed explanation of the server class in
> question]
>
>         This server (embodied primarily in the below ConnectionHandler
> class) is designed to be a one-shot request type deal where the client
> writes all of the request XML and half-closes the socket.  During the
> SAX parse, the request-handing objects are dispatched (with a handle to
> the ConnectionHandler) and asynchronously do their duty, writing their
> output when appropriate, and letting the ConnectionHandler know they are
> finished.  When all requests have finished, the ConnectionHandler closes
> the other half of the socket and terminates.
>
> Thanks,
> mike
>
> ########################################################################
> ##
> package com.gghc.multicello;
>
> import java.util.*;
> import java.net.*;
> import java.io.*;
>
> import org.xml.sax.InputSource;
> import org.xml.sax.XMLReader;
> import org.xml.sax.helpers.XMLReaderFactory;
>
> public class ConnectionHandler extends Thread
> {
>     private Socket    m_sock   = null;
>     private XMLReader m_parser = null;
>     private OutputStream m_outStream = null;
>     private Hashtable m_requests = null;
>     private boolean m_oneShot = true;
>
>     public ConnectionHandler(Socket socket) throws
> org.xml.sax.SAXException, java.io.IOException
>     {
>         m_sock = socket;
>         m_outStream = m_sock.getOutputStream();
>         m_requests = new Hashtable();
>         m_parser =
> XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
>     }
>
>     public synchronized void run()
>     {
>         System.err.println("Firing up SAX parser");
>
>         try {
>
>             InputSource src = new InputSource(m_sock.getInputStream());
>
>             RequestStreamParser rp = new RequestStreamParser(this,
> m_parser);
>
>             m_parser.setContentHandler(rp);
>             m_parser.setErrorHandler(rp);
>
>             output("<responseStream>\n");
>
>             m_parser.parse(src);
>
>             System.err.println("Parser returned from parse()");
>
>             // if there are any requests still open, wait()
>             if(m_requests.size() > 0) {
>                 System.err.println("wait()'ing");
>                 wait();
>             }
>             output("</responseStream>");
>             m_sock.shutdownOutput();
>             m_sock.close();
>
>
>         } catch (Exception e) {
>             System.out.println("Exception caught in CH::run(): " + e);
>             e.printStackTrace();
>         }
>
>     }
>
>     public synchronized int output(String output) {
>         try {
>             System.err.println("Sending: " + output.length() + "
> bytes");
>
>             m_outStream.write(output.getBytes());
>             m_outStream.flush();
>             //System.err.println("Sent: " + output);
>             int sent =0;
>             System.err.println("Sent: " + output.length() + " bytes");
>             return 0;
>         }
>         catch(IOException e) {
>             System.err.println("Exception in output: " + e.getClass() +
> e);
>             e.printStackTrace();
>             return -1;
>         }
>     }
>
>     public boolean oneShot() {
>         return m_oneShot;
>     }
>
>
>     public synchronized void request(Object o, boolean status) {
>         System.err.println(o + " " + (status ? "attached" :
> "detached"));
>
>         if(status) {
>             m_requests.put(o, new Boolean(status));
>         }
>         else {
>             if(m_requests.containsKey(o)) {
>                 m_requests.remove(o);
>                 if(m_requests.size() == 0) {
>                     requestsFinished();
>                 }
> mmm         }
>         }
>     }
>
>     private synchronized void requestsFinished() {
>         System.err.println("All requestsFinished");
>         notifyAll();
>     }
>
> }
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: xerces-j-dev-unsubscribe@xml.apache.org
> For additional commands, e-mail: xerces-j-dev-help@xml.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-j-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-j-dev-help@xml.apache.org