tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
709
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    PhilippGer PhilippGer ist offline Mitglied Bronze
    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);
        }
    }
     

  2. #2
    java123 java123 ist offline Mitglied Bronze
    Registriert seit
    Jun 2009
    Beiträge
    37
    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;
        }
     
    }
     

  3. #3
    SONY2 SONY2 ist offline Mitglied Bronze
    Registriert seit
    Aug 2007
    Beiträge
    33
    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
     

  4. #4
    PhilippGer PhilippGer ist offline Mitglied Bronze
    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)
     

  5. #5
    mirkoku Tutorials.de Gastzugang
    seas,

    habs mal durchgetestet und bei mir klappt das liegt evt daran das du das so startest

    HTML-Code:
    public static void main(String[] args) {
    		new MulServer(3412);
    	}
    versuch das ganze mal so:

    PHP-Code:
    public static void main(String[] args) {
            new 
    MulServer(port);
        } 
    Hab nur deinen Server getestet mit einem von mir geschriebenen Client. der sich einfach nur drauf Connectet

    Du setzt oben den Port als Static Variable mit der du auch mit dem Client drauf Connectest

    HTML-Code:
    public static void main(String[] args) {
    		new MulClient( 1.0, 2.0, 3412);
    	}
    in ---->private static Integer port = 13457; <-------
    PHP-Code:
    public static void main(String[] args) {
            new 
    MulClient1.02.0,port);
        } 
    Gruß
    Geändert von mirkoku (13.07.09 um 08:46 Uhr)
     

  6. #6
    java123 java123 ist offline Mitglied Bronze
    Registriert seit
    Jun 2009
    Beiträge
    37
    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)
     

  7. #7
    PhilippGer PhilippGer ist offline Mitglied Bronze
    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

  1. IdUDP Socket-Fehler abfangen
    Von real_benedikt im Forum Delphi, Kylix, Pascal
    Antworten: 11
    Letzter Beitrag: 16.10.08, 19:21
  2. Antworten: 2
    Letzter Beitrag: 30.01.08, 10:24
  3. Antworten: 2
    Letzter Beitrag: 29.01.08, 14:59
  4. Server Socket und Client Socket
    Von spiderman21 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 2
    Letzter Beitrag: 23.10.07, 17:00
  5. Server Socket und Client Socket
    Von spiderman21 im Forum Netzwerke
    Antworten: 1
    Letzter Beitrag: 22.10.07, 01:48