tutorials.de Buch-Aktion 05/2012
Seite 2 von 2 ErsteErste 12
ERLEDIGT
NEIN
ANTWORTEN
26
ZUGRIFFE
1192
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #16
    Avatar von Masterpurzel
    Masterpurzel Masterpurzel ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Ort
    Vienna, Austria, Austria
    Beiträge
    52
    Zitat Zitat von xanadoo Beitrag anzeigen
    Aber zu dem Zeitpunkt zu welchem du getLocalPort() aufgerufen hattest, war die Variable noch nicht initialisiert.
    Ok, versteh ich, nur wie löse ich das Problem, oder gibt es dafür keine Lösung?
     

  2. #17
    xanadoo xanadoo ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    119
    Doch, die Lösung ist, dass du zuerst start() und erst danach getLocalPort() aufrufst.

    Aber solange ich den Code der Klassen aus welchen diese Methoden aufgerufen werden nicht kenne,
    kann ich dazu nicht viel mehr sagen.
     

  3. #18
    Avatar von Masterpurzel
    Masterpurzel Masterpurzel ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Ort
    Vienna, Austria, Austria
    Beiträge
    52
    Zitat Zitat von xanadoo Beitrag anzeigen
    Doch, die Lösung ist, dass du zuerst start() und erst danach getLocalPort() aufrufst.

    Aber solange ich den Code der Klassen aus welchen diese Methoden aufgerufen werden nicht kenne,
    kann ich dazu nicht viel mehr sagen.
    Ok, hier der komplette Code aller 3 Klassen:

    Server:
    Code 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
    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
    
    import java.net.*;
    import java.io.*;
    import java.util.*;
     
    public class JavaChatServer implements Runnable {
        public static final int PORT = 9999;
        protected ServerSocket listen;
        protected Vector connections;
        Thread connect;
        ArrayList al = new ArrayList();
        
        public static void main(String[] args) {
            new JavaChatServer();
        }
        
        public JavaChatServer() {
            try {
                listen = new ServerSocket(PORT);
            } catch (IOException e) {
                System.err.println("Fehler beim Erzeugen der Sockets: "+e);
                System.exit(1);
            }
     
            connections = new Vector();
     
            connect = new Thread(this);
            connect.start();
        }
        
        public void run() {
            try {
                while(true) {
                    Socket client = listen.accept();
                    
                    Connection c = new Connection(this, client);
                    connections.addElement(c);
                    
                    //Daten vom Client verarbeiten
                    
                    //Client zur Userliste hinzufügen
                    al.add(new JavaChatClient().getLocalPort());
                    //Client-Liste testweise ausgeben
                    System.out.println(al);
                }
            } catch (IOException e) {
                System.err.println("Fehler beim Warten auf Verbindungen: " + e);
                System.exit(1);
            }
        }
        
        public void broadcast(String msg) {
            int i;
            Connection you;
     
            for(i = 0; i < connections.size(); i++) {
                you = (Connection) connections.elementAt(i);
                you.out.println(msg);
            }
        }
    }

    Connection:
    Code 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    import java.net.*;
    import java.io.*;
     
    public class Connection extends Thread {
        protected Socket client;
        protected DataInputStream in;
        protected PrintStream out;
        protected JavaChatServer server;
        
        public Connection(JavaChatServer server, Socket client)
        {
            this.server = server;
            this.client = client;
     
            try {
                in = new DataInputStream(client.getInputStream());
                out = new PrintStream(client.getOutputStream());
            } catch (IOException e) {
                try { client.close(); } catch (IOException e2) {} ;
                System.err.println("Fehler beim Erzeugen der Streams: " + e);
                return;
            }
            
            this.start();
        }
        
        public void run() {
            String line;
     
            try {
                while(true) {
                    line=in.readLine();
                    if(line != null)
                        server.broadcast(line);
                }
            } catch (IOException e) {
                System.out.println("Fehler: " + e);
            }
        }
    }

    Client:
    Code 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
    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    
    import java.net.*;
    import java.io.*;
    import java.awt.*;
    import java.applet.*;
     
    import javax.swing.JOptionPane;
     
    public class JavaChatClient extends Applet implements Runnable {
        private static final long serialVersionUID = 1L;
        public static final int PORT = 9999;
        Socket socket;
        DataInputStream in;
        PrintStream out;
        TextField inputfield;
        TextArea outputarea;
        Thread thread;
        InetAddress ip = null;
        int localport;
        int localip;
        boolean connect;
        
        public void init() {
            inputfield = new TextField();
            outputarea = new TextArea();
            outputarea.setFont( new Font("Dialog", Font.PLAIN, 12));
            outputarea.setEditable(false);
            this.setLayout(new BorderLayout());
            this.add("South", inputfield);
            this.add("Center", outputarea);
            this.setBackground(Color.lightGray);
            this.setForeground(Color.black);
            inputfield.setBackground(Color.white);
            outputarea.setBackground(Color.white);
        }
        
        @SuppressWarnings("deprecation")
        public void start() {
            try {
                socket = new Socket(this.getCodeBase().getHost(), PORT);
                ip = socket.getInetAddress();
                localport = socket.getLocalPort();
                in = new DataInputStream(socket.getInputStream());
                out = new PrintStream(socket.getOutputStream());
                say("Verbindung zum Server aufgenommen...");
                connect = true;
                if (thread == null) {
                    thread = new Thread(this);
                    thread.setPriority(Thread.MIN_PRIORITY);
                    thread.start();
                }
            } catch (IOException e) {
                this.showStatus(e.toString());
                say("Verbindung zum Server fehlgeschlagen!");
                connect = false;
                inputfield.disable();
            }
        }
        
        @SuppressWarnings("deprecation")
        public void stop() {
            try {
                socket.close();
                socket = null;
            } catch (IOException e) {
                //this.(e.toString());
            }
            if ((thread !=null) && thread.isAlive()) {
                thread.stop();
                thread = null;
            }
        }
        
        @SuppressWarnings("deprecation")
        public void run() {
            String line;
     
            try {
                Thread.sleep(100);
                while(true) {
                    line = in.readLine();
                    if(line != null || !line.equals("")) {
                        outputarea.appendText(line + "\n");
                    }
                }
            } catch (IOException e) {
                //say("Verbindung zum Server abgebrochen");
            } catch(Exception e) {
                say("Verbindung zum Server abgebrochen");
                connect = false;
                inputfield.disable();
            }
        }
        
        public boolean action(Event e, Object what) {
            if (e.target == inputfield) {
                String inp = (String) e.arg;
                out.println(inp);
                inputfield.setText("");
                return true;
            }
            return false;
        }
     
        @SuppressWarnings("deprecation")
        public void say(String msg) {
            outputarea.appendText("*** "+ msg +" ***\n");
            if(ip != null && connect == false) {
                outputarea.appendText(ip + " betritt den Raum!\n");
            } else if(ip != null && connect == true) {
                outputarea.appendText(ip + " verlässt den Raum!");
            }
        }
        
        public void setLocalPort(int localport) {
            this.localport = socket.getLocalPort();
        }
        
        public int getLocalPort() {
            return localport;
        }
    }
     

  4. #19
    xanadoo xanadoo ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    119
    Auf Zeile 41 der Klasse JavaChatServer machst du einen neuen JavaClient und rufst direkt getLocalPoart der neuen Instanz auf.
    Zu diesem Zeitpunkt ist aber die Variable localport noch nicht inizialisiert worden, deshalb bekommst du dort auch nichts vernünftiges zurück.

    Hat es einen Grund, dass du dort eine neue Instanz von JavaClient machts?
    Wäre der Client, dessen LocalPort du auslesen willst nicht der Socket aus der Zeile 34 oder ist es Zufall, dass dieser Client heisst?
     

  5. #20
    Avatar von Masterpurzel
    Masterpurzel Masterpurzel ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Ort
    Vienna, Austria, Austria
    Beiträge
    52
    Zitat Zitat von xanadoo Beitrag anzeigen
    Auf Zeile 41 der Klasse JavaChatServer machst du einen neuen JavaClient und rufst direkt getLocalPoart der neuen Instanz auf.
    Zu diesem Zeitpunkt ist aber die Variable localport noch nicht inizialisiert worden, deshalb bekommst du dort auch nichts vernünftiges zurück.
    Ok, wie kann ich das vernünftig lösen, denn direkt danach mit einem
    Code :
    1
    
    System.out.println(socket.getLocalPort());
    bekomme ich was ich will?

    Zitat Zitat von xanadoo Beitrag anzeigen
    Hat es einen Grund, dass du dort eine neue Instanz von JavaClient machts?
    Wäre der Client, dessen LocalPort du auslesen willst nicht der Socket aus der Zeile 34 oder ist es Zufall, dass dieser Client heisst?
    Ich glaube du hast recht, ich versuche das mal zu ändern wenn ich wieder zu Hause bin!
     

  6. #21
    SE Tutorials.de Gastzugang
    AHH ... Jetzt macht es KLICK

    Was du versuchst :

    Du baust vom Client einen Verbindung zum Server auf.
    Der Server bildet darauf hin ein neues Connection-Objekt dem eine this-referenz des Servers *für den Broadcast* und der eben eigegangen Socket übergeben wird.
    Danach erzeugst du ein neues Client-Objekt um darauf die Methode getLocalPort() aufzurufen.

    DAS GEHT NICHT ... zumindest nich SO

    Du kannst vom Server aus nicht die Methode getLocalPort auf dem Client aufrufen ... Davon mal ganz abgesehen das du ein neues , LEERES Objekt erzeugst was sowieso keinen localport haben kann wenn dieser nicht verbunden ist.

    Warum wir da nicht gleich drauf gekommen sind : weil uns der Code erst das verraten hat für das du zu unfähig warst dich richtig Auszudürcken.

    Wenn du jetzt vom Clienten den localport haben willst musst dein Connction-Objekt dies vom Clienten abfragen und dann verarbeiten. Stichwort : Protokoll

    Als Tipp : das jetzt nachträglich in deine Klassen einzubauen ist schwieriger als wenn man diese komplett neu schreiben würde und dabei gleich von vornherein mit einem Protokoll arbeitet.
    Und versuche dich nächste mal etwas genau auszudrücken ... weil ein einfaches : Aufruf von Methode X liefert nicht erwartetes Ergebniss reicht nicht. Wenn du auf dem Server ein neues Client-Objekt erzeugst welches natürlich nicht initialisiert wird und dann eine Methode auf ein Objekt anwendest was eigentlich NULL ist *gut .. bei primitiven Datentypen gibt es glaube ich vorkehrungen das dort keine NPE fliegt* ist klar das du auch nur das zurückbekommst. Auch ist es ein großer irrglaube das du so einfach auf eine Methode auf dem Clienten zugrifen könntest. Klar gibt es wunderschöne Lösungen dies zu tun aber das überstiegt dann doch mit sicherheit deine Fähigkeiten und Verständlichkeiten und desshalb werden ich bewusst hier nichts namentlich nennen. Ich bitte auch die anderen sich in diesem Punkt mal ausnahmsweise zu enthalten.

    Versuch uns also bitte erstmal eindeutig zu erklären was genau du vorhast. Also welchen Port du nun genau von welchem Objekt haben willst und so weiter. Was du dann damit vorhast ist nicht von belang.
     

  7. #22
    Avatar von Masterpurzel
    Masterpurzel Masterpurzel ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Ort
    Vienna, Austria, Austria
    Beiträge
    52
    Zitat Zitat von SPiKEe Beitrag anzeigen
    AHH ... Jetzt macht es KLICK

    Was du versuchst :

    Du baust vom Client einen Verbindung zum Server auf.
    Der Server bildet darauf hin ein neues Connection-Objekt dem eine this-referenz des Servers *für den Broadcast* und der eben eigegangen Socket übergeben wird.
    Danach erzeugst du ein neues Client-Objekt um darauf die Methode getLocalPort() aufzurufen.

    DAS GEHT NICHT ... zumindest nich SO

    Du kannst vom Server aus nicht die Methode getLocalPort auf dem Client aufrufen ... Davon mal ganz abgesehen das du ein neues , LEERES Objekt erzeugst was sowieso keinen localport haben kann wenn dieser nicht verbunden ist.

    Wenn du jetzt vom Clienten den localport haben willst musst dein Connction-Objekt dies vom Clienten abfragen und dann verarbeiten. Stichwort : Protokoll
    Alles klar, Danke. Werde mich in der Richtung mal schlau machen

    Zitat Zitat von SPiKEe Beitrag anzeigen
    Warum wir da nicht gleich drauf gekommen sind : weil uns der Code erst das verraten hat für das du zu unfähig warst dich richtig Auszudürcken.
    Sorry, ich wusste nicht wie ich es sonst beschreiben sollte, versuche mich das nächste Mal
    besser auszudrücken.

    Zitat Zitat von SPiKEe Beitrag anzeigen
    Als Tipp : das jetzt nachträglich in deine Klassen einzubauen ist schwieriger als wenn man diese komplett neu schreiben würde und dabei gleich von vornherein mit einem Protokoll arbeitet.
    Und versuche dich nächste mal etwas genau auszudrücken ... weil ein einfaches : Aufruf von Methode X liefert nicht erwartetes Ergebniss reicht nicht. Wenn du auf dem Server ein neues Client-Objekt erzeugst welches natürlich nicht initialisiert wird und dann eine Methode auf ein Objekt anwendest was eigentlich NULL ist *gut .. bei primitiven Datentypen gibt es glaube ich vorkehrungen das dort keine NPE fliegt* ist klar das du auch nur das zurückbekommst. Auch ist es ein großer irrglaube das du so einfach auf eine Methode auf dem Clienten zugrifen könntest. Klar gibt es wunderschöne Lösungen dies zu tun aber das überstiegt dann doch mit sicherheit deine Fähigkeiten und Verständlichkeiten und desshalb werden ich bewusst hier nichts namentlich nennen. Ich bitte auch die anderen sich in diesem Punkt mal ausnahmsweise zu enthalten.

    Versuch uns also bitte erstmal eindeutig zu erklären was genau du vorhast. Also welchen Port du nun genau von welchem Objekt haben willst und so weiter. Was du dann damit vorhast ist nicht von belang.
    Ist in Ordnung, mal schauen ob ich es so umsetzen kann wie Du es dir vorstellst...
     

  8. #23
    SE Tutorials.de Gastzugang
    Naja wie ich es mir vorstelle ... ist etwas falsch ausgedrückt. Ich habe bereits für meine Anwendungen ein sehr einfaches Protokoll mit dem ich aber alle Informationen übertragen kann.
    Ich hab dir lediglich deine Design-Mängel anschaulich gemacht. Klar werde ich und bestimmt auch die anderen dir gerne helfen das ganze dann so zum Laufen zu bekommen wie du es möchtest und auch mal eigentlich geplant hast. Aber das ganze Thema Netzwerk ist dann doch etwas komplexer als nur eine Verbindung aufzubauen und darüber Daten zu senden.
     

  9. #24
    Avatar von Masterpurzel
    Masterpurzel Masterpurzel ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Ort
    Vienna, Austria, Austria
    Beiträge
    52
    War etwas falsch formuliert

    Betreffenderweise kannst Du mir ein Buch/Bücher/Tutorials für Netzwerkprogrammierung empfehlen?
     

  10. #25
    SE Tutorials.de Gastzugang
    Hmm .. also erlich gesagt habe ich jetzt leider keines parat. Ich arbeite sehr viel mit dem Netzwerk und hatta am Anfang auch solche Probleme die ich mitlerweile gelöst bekommen hab. Wenn du es mir zutraust kann ich auch gerne versuchen dir bei Konkreten Problemen zu helfen. Ob ichs schaffe is natürlich ne andere Frage. Was Literatur angeht müsste man mal vielleicht in den Stickies nachgucken ob dort was hilfreiches zu finden ist.
    Aber ich kann dir gleich sagen : es wird vermutlich nicht DAS BUCH geben da sich das Thema Netzwerk doch sehr breit fächert. Wenn mans mal durchgeht stehen wohl an erster Stelle die OSI-Schichten und die dort eingeordneten Protokolle. Dann vermutlich noch komplizierte Strukturen , NAT , routing , was weis ich. Es wird bestimmt zu jedem Thema mehrere Bücher geben. Müssten wir mal unsere Profis wie Thomas fragen ob die da was gutes kennen. Ich selbst kann dir wie gesagt nur versuchen durch meine Erfahrung zu helfen.
     

  11. #26
    Avatar von Masterpurzel
    Masterpurzel Masterpurzel ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Ort
    Vienna, Austria, Austria
    Beiträge
    52
    Zitat Zitat von SPiKEe Beitrag anzeigen
    Wenn du jetzt vom Clienten den localport haben willst musst dein Connction-Objekt dies vom Clienten abfragen und dann verarbeiten. Stichwort : Protokoll
    Meinst Du damit vllt. RMI? Oder bin ich da auf dem Holzweg?
     

  12. #27
    SE Tutorials.de Gastzugang
    Naja ... ich wollte es eigentlich vermeiden dir diese drei Buchstaben an den Kopf zu werfen da RMI *Remote Method Invocation* schon einiges Hintergrundwissen erfordert und auch nicht so einfach umzusetzen ist wie ein einfaches String-basiertes Protokoll. Außerdem würden dann sicher einige wieder ankommen nach dem Motto : verwende lieber ein fertiges Framework als so dierekt auf RMI zu arbeiten. Darum würde ich da doch schon mit Command-Strings arbeiten nach dem Motto das der Server den Client mit einem definiertem Command fragt : wie ist dein LocalPort und der Client dann darauf antwortet : mein LocalPort ist XXXX ...
    Auch die Frage : auf welcher Seite willst du den LocalPort wissen ? Auf der Serverseite also mit welchem Port der Client am Server läuft oder den Source-Ports des clienten von dem aus er die Verbindung aus aufgebaut hat *die bekommt man nämlich dank TCP auch auf der Serverseite raus*.
     

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 17.03.11, 08:46
  2. Antworten: 13
    Letzter Beitrag: 07.12.09, 13:53
  3. Bean-Variablen als Parameter einer Methode einer anderen Bean
    Von mcdroemmel im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 25.06.09, 17:53
  4. Antworten: 8
    Letzter Beitrag: 12.04.06, 12:20
  5. Per void Methode auf Objekt einer Klasse zugreifen
    Von mkoeni1 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 1
    Letzter Beitrag: 09.04.06, 16:41

Stichworte