Beste Tweakertjes, ik zit met een probleempje mbt tot sockets. Ik ben hobbymatig een programma aan het ontwikkelen waarmee je je gemaakte uren kunt registreren. Het programma wat door meerdere mensen gebruikt gaat worden maakt een verbinding met de database om data te lezen/schrijven. Momenteel gebruik ik vanaf de clients direct een MySQL verbinding, maar dat is niet de juiste manier lijkt me aangezien gebruikertjes met de login allerlei ongewenste activiteiten kunnen bedrijven in mijn database. Daarom mijn idee om er een Java server tussen te gooien welke de gebruikers in staat stelt de door hun vereiste acties uit te voeren. Communicatie tussen server <-> client zal met XML documenten moeten gebeuren aangezien het volgende project onder andere van deze server gebruik moet gaan maken. Ik ben begonnen met me te verdiepen in de werking van sockets maar ik loop op een probleem. Ik gebruik JDOM om XML te parsen en aan te maken, ik gebruik de XMLOutputter klasse voor het verzenden van de data en SAXBuilder voor het inlezen van de data. Als ik vervolgens 2 XML bestanden wil verzenden over de socket (ik wil de verbinding open houden zolang de gebruiker aan het werk is) dan krijg ik de volgende foutmelding als de client het tweede bestand wil sturen:
De code op de server:
En dan de client:
Ik doe vast iets elementairs fout... het stomme is dat alle voorbeelden die ik ben tegengekomen altijd maar 1 ding versturen en dan weer afsluiten, tenzij ze een objectoutputstream gebruiken... maar dat wil ik niet aangezien ik schone XML wil spreken.
Ik heb de code ingekort om het overzicht te bewaren
Java:
1
2
3
4
5
| java.io.IOException: Stream closed at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:145) at java.io.BufferedInputStream.fill(BufferedInputStream.java:189) at java.io.BufferedInputStream.read(BufferedInputStream.java:235) ... |
De code op de server:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| public static void handleSocket(Socket incoming) throws IOException { //incoming.setKeepAlive(true); heeft geen effect SAXBuilder builder; XMLOutputter xmlout; Document doc; BufferedInputStream reader; try { reader = new BufferedInputStream(incoming.getInputStream()); builder = new SAXBuilder(true); doc = builder.build(reader); reader.close(); System.out.println("Eerste xml ontvangen, bezig met ontvangen van tweede..."); reader = new BufferedInputStream(incoming.getInputStream()); builder = new SAXBuilder(true); doc = builder.build(reader); reader.close(); } catch(Exception e) { e.printStackTrace(); } incoming.close(); } |
En dan de client:
Java:
De error krijg ik dus in Client:11 en Server:16.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| client=new Socket("localhost",8189); client.setKeepAlive(true);// ook deze heeft geen effect BufferedOutputStream outstream; outstream=new BufferedOutputStream(client.getOutputStream()); xmlout.output(doc,outstream); outstream.flush(); outstream.close(); System.out.println("Eerste xml verzonden, bezig met verzenden van tweede..."); outstream=new BufferedOutputStream(client.getOutputStream()); xmlout.output(doc,outstream); outstream.flush(); outstream.close(); |
Ik doe vast iets elementairs fout... het stomme is dat alle voorbeelden die ik ben tegengekomen altijd maar 1 ding versturen en dan weer afsluiten, tenzij ze een objectoutputstream gebruiken... maar dat wil ik niet aangezien ik schone XML wil spreken.
Ik heb de code ingekort om het overzicht te bewaren
[ Voor 1% gewijzigd door b19a op 19-04-2005 22:40 . Reden: typotjes ]