[java + TCP + dom]Dlaczego dostaję java.net.SocketException?

Próbuję przesyłać XMLa po sieci, ale wciąż dostaję wyjątek java.net.SocketException: Connection reset po stronie serwera podczas jego odbierania… skąd się on bierze?

Stack Trace:

java.net.SocketException: Connection reset

	at java.net.SocketInputStream.read(Unknown Source)

	at java.net.SocketInputStream.read(Unknown Source)

	at com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableInputStream.read(Unknown Source)

	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source)

	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source)

	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipSpaces(Unknown Source)

	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$TrailingMiscDriver.next(Unknown Source)

	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)

	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)

	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)

	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)

	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)

	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)

	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)

	at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)

	at xmlserver.Server.listen(Server.java:54)

	at xmlserver.Main.main(Main.java:7)

Klient:

public static void main(String [] args) throws Exception

	{


		Socket sock = new Socket("localhost", 666);

		DocumentBuilderFactory builderFactory =

		 DocumentBuilderFactory.newInstance();

		 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

		  DocumentBuilder parser = factory.newDocumentBuilder();

		  Document doc = parser.newDocument();

		  Element root = doc.createElement("root");

		  doc.appendChild(root);

		  Element childElement = doc.createElement("Child");

		  childElement.setAttribute("attribute1","The value of Attribute 1");

		  root.appendChild(childElement);

		  TransformerFactory tranFactory = TransformerFactory.newInstance(); 

		  Transformer aTransformer = tranFactory.newTransformer(); 


		  Source src = new DOMSource(doc); 

		  Result dest = new StreamResult(sock.getOutputStream());

		  aTransformer.transform(src, dest); 

	}

Server:

protected void listen()

	{

		System.out.println("Server started.\n\tListening for connections at port " + port);

		Socket clientSock;

		//while (true)

		{

			try

			{

				clientSock = servSocket.accept();

				DocumentBuilderFactory builderFactory =

				        DocumentBuilderFactory.newInstance();

				 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

				  DocumentBuilder parser = factory.newDocumentBuilder();

				  Document doc = parser.parse(clientSock.getInputStream()); // !!!!!!!! tutaj się wywala !!!!!!!!

				  System.out.println("transaction succeeded");

			}

			catch(Exception e)

			{

				System.err.println("Failed to read");

				e.printStackTrace();

			}

		}

	}[/code]

Po stronie klienta nie zamykasz socketu. Musisz albo w bloku finally sprawdzać czy socket nie jest nullem i potem go zamknąć, albo skorzystać z try-with-resources w Javie 7.