ERLEDIGT
JA
JA
ANTWORTEN
6
6
ZUGRIFFE
709
709
EMPFEHLEN
-
10.07.09 09:51 #1
- Registriert seit
- Jun 2009
- Beiträge
- 26
Hi!
Ich soll für die Uni ein kleines Programm schreiben, dass mit Sockets arbeitet.
EIn Client schickt zwei Double-Zahlen an den Server und dieser berechnet das Produkt und sendet es an den Client zurrück.
Ansich eine einfache Sache, allerdings bekomme ich einen Fehler bei meinem Programm den sich weder ich selbst noch meine Übungsleiter in der Uni erklären konnten.
Der Server startet soweit gut, aber sobald ich einen Clienten starte, schmeißt der Server eine Fehlermeldung.Code :1 2 3 4 5 6 7 8 9
java.net.SocketException: Connection reset at java.net.SocketInputStream.read(Unknown Source) at java.io.ObjectInputStream$PeekInputStream.read(Unknown Source) at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source) at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source) at java.io.ObjectInputStream.readStreamHeader(Unknown Source) at java.io.ObjectInputStream.<init>(Unknown Source) at MulServer.<init>(MulServer.java:33) at MulServer.main(MulServer.java:63)
Diese Fehlermeldung wird beim Erzeugen des Input-Streams des Servers geworfen.
Hat jemand eine Ahnung was das sein könnte?
Client:Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
import java.awt.BorderLayout; import java.awt.List; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.Socket; import javax.swing.JFrame; import javax.swing.JPanel; public class MulClient { private static String url = ""; private static Integer port = 13457; private List list; public MulClient( Double a,Double b,Integer port){ this.port = port; try{ Socket client = new Socket(url, port); writeGUI("start"); ObjectInputStream read = new ObjectInputStream (client.getInputStream()); ObjectOutputStream writer = new ObjectOutputStream( client.getOutputStream() ); writeGUI("erste Zahl"); writer.writeDouble(a); writer.flush(); writeGUI("zweite Zahl"); writer.writeDouble(b); writer.flush(); client.wait(5000); Double e = read.readDouble(); writeGUI("Ergebnis empfangen"); writeGUI(a + " x " + b + " = " + e); client.close(); }catch(IOException e){ System.out.println("1"); e.printStackTrace(); } catch (InterruptedException e) { System.out.println("warten-fehler"); e.printStackTrace(); } } public static void main(String[] args) { new MulClient( 1.0, 2.0, 3412); } public void draw(){ JFrame frame = new JFrame("Client"); JPanel pane = new JPanel(); pane.setLayout( new BorderLayout() ); pane.setPreferredSize(new java.awt.Dimension(500, 400)); this.list = new List(); pane.add(list); frame.setContentPane(pane); frame.pack(); frame.setVisible(true); } public void writeGUI(String s){ this.list.add(s); } }
Server:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
import java.awt.BorderLayout; import java.awt.List; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JFrame; import javax.swing.JPanel; public class MulServer { private static Integer port = 13457; private static ServerSocket server; private List list; public MulServer(Integer port){ draw(); this.port = port; writeGUI("Port: "+port); try{ server = new ServerSocket(port); writeGUI("Server:\thorcht..."); Socket con = server.accept(); writeGUI("Server:\tVerbindung empfangen"); ObjectInputStream read = new ObjectInputStream(con.getInputStream()); ObjectOutputStream write = new ObjectOutputStream(con.getOutputStream()); writeGUI("Warten auf Zahl 1"); Double a = read.readDouble(); writeGUI(a+" empfangen"); writeGUI("Warten auf Zahl 2"); Double b = read.readDouble(); writeGUI(b+" empfangen"); Double e = a*b; writeGUI(e+" berechnet"); write.writeDouble(e); writeGUI("Server:\t Ergebnis versendet"); server.close(); }catch(IOException e){ System.out.println("Error 2"); System.out.println(e.toString()+"\n\n"); e.printStackTrace(); }finally{ try { this.server.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { new MulServer(3412); } public void draw(){ JFrame frame = new JFrame("Server"); JPanel pane = new JPanel(); pane.setLayout( new BorderLayout() ); pane.setPreferredSize(new java.awt.Dimension(300, 300)); this.list = new List(); pane.add(list); frame.setContentPane(pane); frame.pack(); frame.setVisible(true); } public void writeGUI(String s){ this.list.add(s); } }
-
Ich hab das Gleiche vor etwas einem Jahr gemacht und den Code zum Glück noch.
Hab die Codes eben verglichen und bin mir nicht mehr sicher, ob du das server.accept() in einem Thread laufen lassen musst, sodass es immer wieder aufgerufen wird. Das hab ich bei deinem Code mal eingebaut. hab aber immer noch die gleiche Fehlermeldung bekommen. Das Ganze ist bei mir leider schon lange her.
Ich kann dir mal meinen Code geben. Ich hab noch eine zusätzliche Klasse Values, wo einfach die 2 Doublewerte gespeichert werden.
Client:
Beim Client ist es ganz wichtig, dass du zuerst den OutputStream und erst dann den InputStream instanzierst. Sonst bekommt der Client irgendwie keine Antwort
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
package client; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; import com.Values; /** * Client der dem Server Werte schickt und die Antwort liest und ausgibt * */ public class ObjectClient { private Object response = null; /** * Konstruktor, stellt eine Verbindung mit dem Server her, schickt eine * Instanz von Values und liest die Anwort des Servers * * @param values * Instanz von Values */ public ObjectClient(Object values) { ObjectOutputStream output = null; ObjectInputStream input = null; Socket socket = null; try { socket = new Socket("localhost", 4000); output = new ObjectOutputStream(socket.getOutputStream()); input = new ObjectInputStream(socket.getInputStream()); output.writeObject(values); output.flush(); response = input.readObject(); output.close(); input.close(); } catch (Exception e) { System.out.println(e.getMessage()); } } /** * Startet den Server setzt die 2 Doublewerte * * @param argv */ public static void main(String argv[]) { Values values = new Values(); // Wenn andere Werte übergeben werden sollen, dann hier ändern values.setValue1(14.55); values.setValue2(85.22); ObjectClient client = new ObjectClient(values); System.out.println(client.getResponse()); } /** * @return the response */ public Object getResponse() { return response; } }
Server:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
package server; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; import com.Values; /** * Server der die Anfrage des Servers liest, die Operationen ausführt und dem * Client eine Antwort sendet * */ public class ObjectServer implements Runnable { /** * Serversocket */ private ServerSocket serverSocket; /** * Konstruktor, stellt eine Verbindung zum Client her und startet einen * neuen Thread */ public ObjectServer() { super(); try { serverSocket = new ServerSocket(4000); new Thread(this).start(); } catch (IOException e) { e.printStackTrace(); } } /* * (non-Javadoc) * * @see java.lang.Runnable#run() */ public void run() { Socket client; ObjectInputStream input = null; ObjectOutputStream output = null; try { client = serverSocket.accept(); new Thread(this).start(); input = new ObjectInputStream(client.getInputStream()); output = new ObjectOutputStream(client.getOutputStream()); // Gesendetes Objekt in einer Variable speichern Object object = input.readObject(); // Wenn dem Server eine Instanz von Values geschickt wird if (object instanceof Values) { Values values = (Values) object; Double value1 = values.getValue1(); Double value2 = values.getValue2(); // Ergebnisse mit den 2 Doublewerten ausrechnen Double addition = value1 + value2; Double subtraktion = value1 - value2; Double mulitplikation = value1 * value2; Double division = value1 / value2; // Dem Client eine Antwort senden output.writeObject("Addition: " + addition + "\nSubtraktion: " + subtraktion + "\nMultiplikation: " + mulitplikation + "\nDivision: " + division); output.flush(); } // Wenn eine unbekannte Instanz gesendet wird else { System.out.println("Unbekanntes Objekt"); output.flush(); } } catch (Exception e) { e.printStackTrace(); } } /** * Startet den Server * * @param args */ public static void main(String[] args) { new ObjectServer(); } }
Values:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
package com; import java.io.Serializable; /** * Klasse Values die an den Server geschickt wird. Zwei Doublewerte können * gesetzt werden * */ public class Values implements Serializable { private static final long serialVersionUID = -3428114904655899216L; /** * Erster Doublewert */ private Double value1; /** * Zweiter Doublewert */ private Double value2; /** * @return the value1 */ public Double getValue1() { return value1; } /** * @param value1 * the value1 to set */ public void setValue1(Double value1) { this.value1 = value1; } /** * @return the value2 */ public Double getValue2() { return value2; } /** * @param value2 * the value2 to set */ public void setValue2(Double value2) { this.value2 = value2; } }
-
Hab auch mal en bisschen mit deinem Code rumgespielt.
In deiner Client Klasse muss tatsächlich der OutputStream zuerst instanziert werden.
Ausserdem muss in der Server Klasse noch geflusht werden nachdem du das Ergebnis sendest. Dann hat das ganze bei mir funktioniert.
Wenn du weiterhin Probleme hast kann ich dir den geänderten Code gerne noch posten.
Hoffe ich konnte dir ein bisschen helfen.
Gruß
sony2
-
10.07.09 23:04 #4
- Registriert seit
- Jun 2009
- Beiträge
- 26
Aaaaalso.. erstmal danke fürs Feedback

Output- vor InputStream ist berücksichtigt....
server.accept()
lässt an der Stelle halten, bis eine Verbindung besteht.
Ist natütlich sinnvoll es in einem Thread laufen zu lassen, weil das Programm ja normalerweise nicht nur einmal auf eine Verbindung warten soll.
Da hier zum Test aber nur eine Verbindung gemacht wird, kann es auch so stehen bleiben.
Ansonsten habe ich immernoch den selben Fehler...
werde jetzt mal den Code von java123 nehmen und den bei mir testen.
€dit:
Funktioniert einwandfrei...ich habe keine Ahnung was bei mir da im Argen liegt...
Werde das Programm dann auf Basis deines Codes abändern, wenn das genehm ist
Geändert von PhilippGer (10.07.09 um 23:17 Uhr)
-
13.07.09 08:30 #5mirkoku Tutorials.de Gastzugang
seas,
habs mal durchgetestet und bei mir klappt das liegt evt daran das du das so startest
versuch das ganze mal so:HTML-Code:public static void main(String[] args) { new MulServer(3412); }
Hab nur deinen Server getestet mit einem von mir geschriebenen Client. der sich einfach nur drauf ConnectetPHP-Code:public static void main(String[] args) {
new MulServer(port);
}
Du setzt oben den Port als Static Variable mit der du auch mit dem Client drauf Connectest
in ---->private static Integer port = 13457; <-------HTML-Code:public static void main(String[] args) { new MulClient( 1.0, 2.0, 3412); }
GrußPHP-Code:public static void main(String[] args) {
new MulClient( 1.0, 2.0,port);
}
Geändert von mirkoku (13.07.09 um 08:46 Uhr)
-
Klar kannst du meinen Code brauchen und verändern

Mit der Änderung von mirkoku dürfte es wohl auch funktionieren. Habe ebenfalls gesehen, dass du den Port mit dem Konstruktoraufruf übergibst und nachher setzt. Jedoch habe ich nicht bemerkt, dass Port eine static Variable ist :/
Edit: Frage: bist du Azubi und arbeitest bei einer Bank mit 3 Buchstaben?
(ich weiss da oben steht UNI, aber komischerweise musste ich dasselbe vor genau einem Jahr auch machen)
Geändert von java123 (13.07.09 um 14:10 Uhr)
-
13.07.09 15:42 #7
- Registriert seit
- Jun 2009
- Beiträge
- 26
Das ganze geht nun.. habe deinen Code entsprechend abgeändert und es läuft.. aber ich merks mir für die Zukunft 
Und neeee, arbeite bei keiner Bank!
Ist ne Aufgabe für Fortgeschrittene Programmiertechniken an der Uni...
Das ganze war ne Vorbereitung für ne Client-Server-Anwendung.. ne Art simulierter Onlineshop mit Verwaltungs- und Verkaufs-Client
Danke nochmal an Alle für die Hilfe
Ähnliche Themen
-
IdUDP Socket-Fehler abfangen
Von real_benedikt im Forum Delphi, Kylix, PascalAntworten: 11Letzter Beitrag: 16.10.08, 19:21 -
'Socket Error #10038 Socket operation on non-socket'
Von jupp2oo8 im Forum C/C++Antworten: 2Letzter Beitrag: 30.01.08, 10:24 -
'Socket Error #10038 Socket operation on non-socket'
Von jupp2oo8 im Forum C/C++Antworten: 2Letzter Beitrag: 29.01.08, 14:59 -
Server Socket und Client Socket
Von spiderman21 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 2Letzter Beitrag: 23.10.07, 17:00 -
Server Socket und Client Socket
Von spiderman21 im Forum NetzwerkeAntworten: 1Letzter Beitrag: 22.10.07, 01:48





Zitieren
Login





