tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
25
ZUGRIFFE
706
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    noxum noxum ist offline Mitglied Bronze
    Registriert seit
    Mar 2011
    Beiträge
    32
    Guten Morgen liebes Forum,

    ich bin gerade dabei für die Schule ein kleinen Eco-Server zu programmieren und bin schon über ein Problem gestolpert.

    Und zwar soll der Client über eine grafische Oberfläche, welche ich mit dem Java-Editor erstellt habe, auf einen beliebigen Server connecten können. Das verbinden habe ich schonmal hinbekommen doch nun hängt es, da man bei der grafischen Oberfläche ja nicht direkt über die Konsole etwas an den Server senden kann, wie es beispielsweise bei telnet geht, habe ich mich etwas in der Documentation von Java umgesehen und die zwei Methoden getOutputStream() und getInputStream() gefunden. Also habe ich nochmal mit der Hilfe von Google geguckt ob diese Methoden auch dafür gedacht sind und darauf direkt getestet.
    Doch immer wenn ich
    Code :
    1
    2
    
    OutputStream out;
    out = socket.getOutputStream();
    sagt er mir, dass er diese Methode nicht finden kann. Obwohl ich oben folgendes eingebunden habe:

    Code :
    1
    2
    3
    4
    
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.net.*;

    Weiß einer wieso er die Methode nicht kennt? Bin für jede Antwort dankbar, nach ewigen suchen im Internet hab ich langsam keine Ahnung mehr.

    (Wenn der ganze Code benötigt wird kann ich diesen auch noch reinstellen)
    Achja
    Code :
    1
    
    socket.isConnected();
    Findet er übrigens auch nicht, obwohl diese Methode in der Documentation unter Socket steht und ich wie oben beschrieben ja die ganze java.net.*; Bibliothek eingebunden habe.

    MFG Noxum
    (Tschuldigung dafür das es so viel Text zu so später Stunde ist :P)
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.503
    Hi

    wird überhaupt irgendeine Methode in socket nicht als Fehler gemeldet?

    Zeigst du mal die Erstellung der Variable?
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  3. #3
    noxum noxum ist offline Mitglied Bronze
    Registriert seit
    Mar 2011
    Beiträge
    32
    Guten Morgen und danke für deine schnelle Antwort.

    Ja Methoden wie
    Code :
    1
    
    socket.connect();

    werden nicht als fehler angezeigt und auf den Server komme ich ja auch.
    Die Erstellung sieht so aus:

    Code :
    1
    
    private Socket s = null;
    Erstmal habe ich sie am Anfang des Programms initialisiert.

    Code :
    1
    2
    
    s = new Socket(ip,port);
    s.connect();
    Dann habe ich ein neues Socketobjekt erstellt und es zum Server verbinden lassen.

    Code :
    1
    2
    
    out = s.getOutputStream();
    in = s.getInputStream();
    Und dann ein paar Zeilen später hab ich dann veruscht diesen Input- und OutputStream zu erstellen.

    Code :
    1
    2
    
      private OutputStream out;
      private InputStream in;
    in und out habe ich auch am Anfang des Programms initialisiert.


    Unser Lehrer hat uns leider wenig Informationen geben, weshalb ich halt einfach ein wenig ausprobiert habe
    Aber hoffe mal es ist soweit alles richtig.

    MFG Noxum
     

  4. #4
    SE Tutorials.de Gastzugang
    Also erstens : was soll das denn ?
    Code java:
    1
    2
    
    Socket socket=new Socket(String, int);
    socket.connect();
    Ich glaube hier solltest du noch mal ganz genau in der API nachlesen ...
    Wenn du einen Socket mit Host und Port erzeugst wird dieser automatisch verbunden.
    Außerdem gibt es folgende Methode überhaupt nicht :
    Code java:
    1
    
    Socket.connect();
    Ich glaube hier ist dann doch mal ein wenig mehr wenn nicht sogar der komplette Source nötig. Weil wenn
    Code java:
    1
    
    Socket.connect();
    NICHT als FEHLER makiert wird dann arbeitest du definitiv NICHT mit java.net.Socket sondern mit irgend etwas anderem.

    PS : verwende bitte der Sprache entsprechende Code-Tags *siehe Signatur*
    noxum bedankt sich. 

  5. #5
    noxum noxum ist offline Mitglied Bronze
    Registriert seit
    Mar 2011
    Beiträge
    32
    Hmm... das ist komisch O.o in der Documentation ist aber unter Socket die Methode Connect und ohne Connect kommt bei meinem Server auch nichts an.


    Ok aber ich schätze mal du hast da schon mehr Erfahrungen, kannst du mir dann sagen wie man sich mit einem Server verbindet ohne das über die Konsole mit Telnet zu machen?
    Bis jetzt haben wir es immer mit Telnet gemacht und eigentlich war ich ganz froh, dass es jetzt auch mit Connect ging.

    MFG Noxum


    Edit 1: Sorry wegen den Tags, hab gedacht die normalen reichen :/
    Edit 2: Also ich hab es gerade nochmal ohne die connect Methode versucht und da tut sich garnichts. :/
    Edit 3: Ups garnicht gesehen das du den Code willst :P Naja hier ist er:


    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
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.net.*;
    import java.lang.*;
     
     
    /**
      *
      * Beschreibung
      *
      * @version 1.0 vom 21.09.2011
      * @author
      */
     
    public class Eco extends Frame {
      // Anfang Variablen
      private Label label1 = new Label();
      private TextField tf_ip = new TextField();
      private Label label2 = new Label();
      private TextField tf_port = new TextField();
      private TextArea ta_ausgabe = new TextArea("", 1, 1, TextArea.SCROLLBARS_VERTICAL_ONLY);
      private TextField tf_eingabe = new TextField();
      private Button verb = new Button();
      private Button bt_send = new Button();
      private OutputStream out;
      private InputStream in;
      private Socket s = null;
      // Ende Variablen
     
      public Eco(String title) {
        // Frame-Initialisierung
        super(title);
        addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent evt) { dispose(); }
        });
        int frameWidth = 333; 
        int frameHeight = 317;
        setSize(frameWidth, frameHeight);
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        int x = (d.width - getSize().width) / 2;
        int y = (d.height - getSize().height) / 2 ;
        setLocation(x, y);
        Panel cp = new Panel(null);
        add(cp);
        // Anfang Komponenten
     
        label1.setBounds(16, 16, 25, 24);
        label1.setText("IP:");
        label1.setFont(new Font("Dialog", Font.PLAIN, 17));
        label1.setForeground(Color.WHITE);
        cp.add(label1);
        tf_ip.setBounds(40, 16, 145, 24);
        tf_ip.setText("");
        tf_ip.setFont(new Font("Dialog", Font.PLAIN, 13));
        cp.add(tf_ip);
        label2.setBounds(208, 16, 39, 24);
        label2.setText("Port:");
        label2.setFont(new Font("Dialog", Font.PLAIN, 17));
        label2.setForeground(Color.WHITE);
        cp.add(label2);
        tf_port.setBounds(248, 16, 57, 24);
        tf_port.setText("");
        tf_port.setFont(new Font("Dialog", Font.PLAIN, 13));
        cp.add(tf_port);
        ta_ausgabe.setBounds(16, 96, 289, 129);
        ta_ausgabe.setText("");
        ta_ausgabe.setFont(new Font("Dialog", Font.PLAIN, 13));
        cp.add(ta_ausgabe);
        tf_eingabe.setBounds(16, 232, 289, 24);
        tf_eingabe.setText("");
        tf_eingabe.setFont(new Font("Dialog", Font.PLAIN, 13));
        cp.add(tf_eingabe);
        verb.setBounds(56, 48, 209, 41);
        verb.setLabel("Connect");
        verb.setFont(new Font("Dialog", Font.PLAIN, 13));
        verb.setForeground(Color.BLACK);
        verb.setCursor(new Cursor(Cursor.HAND_CURSOR));
        cp.add(verb);
        verb.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent evt) {
            verb_ActionPerformed(evt);
          }
        });
     
        bt_send.setBounds(72, 264, 169, 25);
        bt_send.setLabel("Send");
        bt_send.setFont(new Font("Dialog", Font.PLAIN, 13));
        bt_send.setCursor(new Cursor(Cursor.HAND_CURSOR));
        cp.add(bt_send);
        bt_send.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent evt) {
            bt_send_ActionPerformed(evt);
          }
        });
     
        cp.setBackground(new Color(0x404040));
        // Ende Komponenten
     
        setResizable(false);
        setVisible(true);
      }
     
      // Anfang Ereignisprozeduren
      public void verb_ActionPerformed(ActionEvent evt) {
        try
        {
    //-----------------------------------------------------------------------> Hier ist ein Fehler ? ;D -->
           String ip = tf_ip.getText(); 
           int port = Integer.parseInt(tf_port.getText());
           ta_ausgabe.setText("IP:"+ip+"\nPort:"+port);
           s = new Socket(ip,port);
           s.connect();
           //out = s.getOutputStream();
           //in = s.getInputStream;
           
     
     
     
     
        }
        catch(Exception e)
        {
     
        }
     
        
      }
     
      public void bt_send_ActionPerformed(ActionEvent evt) {
     
      }
     
      // Ende Ereignisprozeduren
     
      public static void main(String[] args) {
        new Eco("Eco");
      }
    }

    Hoffe es ist gut lesbar, achja hier ist auch nochmal der kleine EcoServer mit welchem ich gerade teste ob eine Verbindung besteht.
    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
    
    public class EchoServer
    {
      public static void main (String args[])
      {
        try
        {
          ServerSocket server = new ServerSocket(10000);
          String text;
          boolean ende = false;
          boolean serverZu = false;
          do
          {
            Socket socket = server.accept();
            do
            {
              System.out.println("Neuer User");
              text = socket.readLine();
              socket.write(text+"\n\r");
              if (text.equals("quit"))
              ende = true;
              if (text.equals("close"))
              {
                ende = true;
                serverZu = true;
              }
            }
            while(!ende);
          socket.close();
          }
          while (!serverZu);
          server.close();
        }
        catch (Exception e)
        {
     
        }
      }
    }

    Also sobald ein das Socket ein accept() bekommt gibt er in der Konsole "Neuer User" aus, und das macht er mit connect O.o


    Edit 22453: Hier ist auch nochmal ein Link zu einem Bild wie das ding überhaupt aussieht:Drück mich !
    Geändert von noxum (24.09.11 um 12:00 Uhr)
     

  6. #6
    Xeonkryptos Xeonkryptos ist offline Mitglied
    Registriert seit
    Jun 2011
    Beiträge
    12
    Ich kann dir jetzt nicht so helfen, wie das die anderen können, aber ich kann dir sagen, dass du ganz sicher nicht die
    Code java:
    1
    
    Socket.connect()
    verwenden kannst, da es im java.net.Socket-package keine statische Methode gibt!
    Es gibt Methoden, die connect heißen, aber diese erwarten mindestens einen Parameter!
    Erste Methode:
    Code java:
    1
    
    public void connect(SocketAddress endpoint) throws IOException

    Zweite Methode:
    Code java:
    1
    
    public void connect(SocketAddress endpoint, int timeout) throws IOException

    Somit liegt dein Fehler dann wohl dort.
    Socket-API
    noxum bedankt sich. 

  7. #7
    noxum noxum ist offline Mitglied Bronze
    Registriert seit
    Mar 2011
    Beiträge
    32
    Hm stimmt hast recht, hab garnicht gesehen das die Parameter erwarten. Aber komisch das trozdem eine Verbindung zum Server hergestelt wird. Würde mich ja mal interessieren was da passiert.

    OH! ich glaub ich hab den Fehler gefunden >.< Unser Lehrer meinte mal, dass er die Klasse Socket etwas umgeschrieben hat :/ und jetzt sehe ich, dass in der Klasse eine Connect Methode ist welche keine Parameter erwartet und einen boolischen Wert zurück gibt.

    Na super, das heißt wenn er die Klasse umgeschrieben hat kann ich die standart Methoden garnicht verwenden :/


    MFG Noxum


    Edit :Naja trozdem vielen Dank an alle für die Mühe... dann schlag ich mich mal weiter :/ mal sehen wie weit ich komme
    Geändert von noxum (24.09.11 um 13:02 Uhr)
     

  8. #8
    SE Tutorials.de Gastzugang
    Zitat Zitat von Xeonkryptos Beitrag anzeigen
    ... da es im java.net.Socket-package keine statische Methode gib!
    Ähm WAS ?

    Erstens : java.net.Socket ist eine KLASSE ! Und kein Package ...
    Zweitens : wie kommst du auf ein STATIC ? Etwa weil ich geschrieben habe
    Code java:
    1
    
    Socket.connect();
    ? Wenn du seinen Code mal genau lesen würdes dann würdest du sehen das er mit einem Socket-Objekt arbeitet ... das heißt er verwendet gar keine STATIC ...

    Zitat Zitat von noxum Beitrag anzeigen
    Code java:
    1
    
    import java.lang.*;
    WAS ZUR HÖLLE ? Das ist nicht dein ernst das du java.lang importierst oder ? java.lang ist das Basis-Package von Java in dem Klassen wie Object und Class enthalten sind. Da dieses Package die Grundlage von allem anderen ist ist es sowieso immer "importiert" ... das kann also raus.

    Zitat Zitat von noxum Beitrag anzeigen
    Edit 22453: Hier ist auch nochmal ein Link zu einem Bild wie das ding überhaupt aussieht: http://img69.imageshack.us/img69/2937/ecoy.png
    Du weist aber schon das wir hier eine Anhangs-Funktion haben oder ? Verwende diese bitte auch ! Das Problem bei Fremdhostern ist das dort die Bilder irgendwann gelöscht werden und man später auf diese keinen Zugriff mehr hat. Lade also Screenshots und Codes immer über die Anhangsfunktion HIER hoch.

    Zitat Zitat von noxum Beitrag anzeigen
    OH! ich glaub ich hab den Fehler gefunden >.< Unser Lehrer meinte mal, dass er die Klasse Socket etwas umgeschrieben hat :/ und jetzt sehe ich, dass in der Klasse eine Connect Methode ist welche keine Parameter erwartet und einen boolischen Wert zurück gibt.
    Lege deinem Lehrer bitte FOLGENDES ans Herz :
    Wenn er meint irgendwelche Klassen "umzuschreiben" das er diese
    1) in einem komplett neuem Package unterbringt
    2) diesen "neuen" Klassen auch neue Namen wie z.B. CustomSocket gibt ...
    Wenn das wie bis jetzt scheinbar weiterhin NICHT macht wir es immer wieder zu solchen kleinen Problemen kommen ... und irgendwann in einem größeren Projekt dann mal richtig krachen ...
    Das Problem für dich : wenn du uns Code mit diesen Custom-Klassen postest und wir das nicht wissen werden wir dich immer fälchlicherweise auf die API verweisen und deine vermeindlichen Fehler bemängeln die so in deiner Entwicklungsumgebung allerdings funktionieren.
    Außerdem sollte der Compiler schon einen haufen Fehler werfen wenn man zwei Klasse mit selben Namen hat. Außer natürlich jemand ist so clever und gibt diesen auch noch die selben Packages ... dann hat man nur noch ein großes Chaos.

    btw : es heißt immer noch Echo ... mit H ... auch im Englischen ...

    Der Fehler lag also hier weniger bei dir als bei deinem Lehrer ... und daran das du ihm vertraut und mit diesem Mist den er da zusammengezimmert hat gearbeitet hast. Ich würde dir empfehlen diesen ganzen Custom-Mist zu entfernen und NUR mit der Standard-API zu arbeiten. Das wird es für dich später einfacher machen ...

    Und noch mal zur Arbeitsweise von java.net.Socket :
    Wenn du ein neues Socket-Objekt erzeugst ... und dem Konstruktor das Ziel mitgibst wird der Socket automatisch connected ...
    Um jetzt mit den connect()-Methoden zu arbeiten erstellst du einen "leeren" Socket und gibst das Ziel über eine der beiden connect()-Methoden an ...
    Aber einem Socket im Konstruktor das Ziel mitgeben und dann mit einer NICHT vorhandenen Methode connecten wollen ... das funktioniert so nicht ... zumindest nicht wenn man mit der Standard-API arbeitet.
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Compiler findet Methode nicht-ecoy.png  
    noxum bedankt sich. 

  9. #9
    noxum noxum ist offline Mitglied Bronze
    Registriert seit
    Mar 2011
    Beiträge
    32
    Danke für deine Informationen, ja das mit dem Echo weiß ich ja eigentlich habe mich nur mal verlesen und dachte die ganze Zeit mein Lehrer hatte ihn mal Eco genannt.
    Naja hab mich jetzt mal ein wenig in der Klasse von meinem Lehrer umgeschaut und klappt jetzt auch fast alles. Ich glaube er wollte es mit der neuen Klasse für die Schüler einfacher machen, hat aber wohl nicht überdacht das man sehr verwirrt sein kann wenn in der API etwas völlig anderes steht.

    Naja danke für alles
    MFG Noxum
     

  10. #10
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.503
    Zitat Zitat von noxum Beitrag anzeigen
    Ich glaube er wollte es mit der neuen Klasse für die Schüler einfacher machen
    Damit macht er euch überhaupt keinen Gefallen.
    Was hilft es, mit Klassen zu üben, die ihr nach der Schule nie wieder sehen werdet?

    Der Lehrer sollte das wenigstens sagen, dass ihr da kein Original-Socket verwendet...
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  11. #11
    SE Tutorials.de Gastzugang
    Was bitte soll denn daran einfacher sein wenn du einen Socket erzeugst der , dadurch das du ihm sein Zeil schon im Konstruktor mitgegeben hast , sowieso schon auto-connected ist und diese dann erst mit einer völlig aus der Luft gegriffenen Methode connecten musst ?
    Das ist erstens umständlicher als es die Standard-API und zweitens wie sheel schon sagte : wenn ihr euch nach der Schule drauf verlasst das überall diese modifizierte Klasse vorhanden ist ... was nun mal nicht der Fall ist ... werdet ihr noch ernste Probleme bekommen.
     

  12. #12
    noxum noxum ist offline Mitglied Bronze
    Registriert seit
    Mar 2011
    Beiträge
    32
    Ja das stimmt schon, aber in der Klasse werden ein paar andere Dinge direkt mit initialisiert was es warscheinlich für manche einfacher machen soll. Kla ist das für später beschissen, aber zur Zeit muss ich es wohl so lernen, da ist sonst Probleme bei Arbeiten oder ähnliches bekomme.

    Kennt einer ein gutes Tutorial für das Verbinden von Threads? Also das zwei Threads miteinander Kommunizieren können ?
     

  13. #13
    SE Tutorials.de Gastzugang
    Kannst du uns den Source dieses CustomSockets mal bitte posten ... ich möchte mal sehen ob dein Lehrer wirklich so intiligent war und dieser Klasse das selbe Package gegeben hat. Außerdem möchte ich mal wissen was darin so wichtiges mit-initialisiert wird ...

    Außerdem : warum solltest du Probleme bei Arbeiten / Prüfungen bekommen ...
    Ich würde einfach nur um dem Lehrer zu zeigen das er Mist gebaut hat mit voller absicht NUR die Standard-API verwenden ... und wenn ich dazu 500 Zeilen mehr schreiben müsste ...
     

  14. #14
    noxum noxum ist offline Mitglied Bronze
    Registriert seit
    Mar 2011
    Beiträge
    32
    Naja es geht ja um mein Abi xD Da muss ich ein wenig aufpassen
    Ja die Socket Klasse ist seeehr abgespeckt wie ich finde aber bittesehr.

    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
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.BufferedReader;
     
    /**
     * <b>Ein-/Ausgabe über Sockets</b>. <br />
     *  Ein Objekt der Klasse Socket kapselt eine Socket-Schnittstelle.
     *  Festlegung der Socket-Parameter kann nur bei der Objekt-Erzeugung
     *  vorgenommen werden.<br />
     *  <br />
     *  Das Socket-Objekt kann sich mit einem Server-Socket.
     *  Ob die Verbindungsanforderung erfolgreich war, kann durch den Rückgabewert
     *  der Methode {@link Socket#connect connect()} festgestellt werden (true, wenn
     *  die Verbindung akzeptiert wurde).<br />
     *  <br />
     *  Das Socket-Objekt gestattet im Zustand &quot;verbunden&quot; das Lesen bzw.
     *  Schreiben von einzelnen Bytes, Byte-Arrays oder Strings von der bzw. auf
     *  die Socket-Schnittstelle.<br />
     *  <br />
     *  Copyright 2006, Michael Zimmer<br />
     *  <br />
     *  @author   Michael Zimmer
     *  @version  1.1 (Mo, 13.03.2006, 17:42 MEZ)
     *  @see ServerSocket
     */
    public class Socket {
        /** Der Hosname des Servers. */
        private String hostname;
        /** Der Port, auf dem der Server-Socket horcht. */
        private int port;
        /** Der Socket. */
        private java.net.Socket socket;
        /** Ein BufferdReader zum Lesen von Strings */
        private BufferedReader reader;
     
        /** Konstruktor. <br />
         *  <br />
         *  Erzeugt einen neuen Socket mit der angegebenen Portnummer zu dem
         *  angegebenen Host.
         *  <br />
         *  @param hostname der Hostname des Servers
         *  @param port der Port, auf dem der Server horcht
         *  @throws IOException
         */
        public Socket(String hostname, int port) throws IOException {
            this.hostname = hostname;
            this.port = port;
        }
        /** Konstruktor. <br />
         *  <br />
         *  Erzeugt einen neuen Socket mit der angegebenen Socket.
         *  Wird vom ServerSocket benutzt.
         *  <br />
         *  @param socket der Socket, mit dem das Socket-Objekt arbeiten soll
         *  @throws IOException
         */
        public Socket(java.net.Socket socket) throws IOException {
            this.socket = socket;
            this.port = socket.getPort();
            this.hostname = socket.getRemoteSocketAddress().toString();
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        }
        /** Schließt den Socket.  <br />
         *  Nach dem Schließen des Socket ist das Socket-Objekt
         *  nicht mehr verbunden.<br />
         *  @throws IOException
         */
        public void close() throws IOException {
            reader.close();
            socket.close();
        }
        /** Verbindet das Socket-Objekt zu der entsprechenden
         *  Portnummer auf dem entsprechenden Host.  <br />
         *  <br />
         *  Ging alles gut, ist das Socket-Objekt verbunden.
         *  <br />
         *  @return  true, wenn die Verbindung akzeptiert wurde
         */
        public boolean connect() {
            try {
              socket = new java.net.Socket(hostname, port);
              reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            }
            catch (Exception e) {
                return false;
            }
            return true;
        }
     
    //  --- Implementierung Leseoperationen ------------------------------
     
        /** Prüfen, ob Daten verfügbar sind. <br />
         *  <br />
         *  Liefert die Anzahl der Bytes, die vom Socket gelesen werden können,
         *  ohne beim nächsten Aufruf von read() zu blockieren.<br />
         *  <br />
         *  @return Anzahl der verfügbaren Bytes
         *  @throws IOException
         */
        public int dataAvailable() throws IOException {
            return socket.getInputStream().available();
        }
     
        /** Lesen eines Zeichens vom Socket. <br />
         *  <br />
         *  Das Zeichen wird als int im Bereich zwischen 0 bis 255 geliefert.
         *  Die Methode blockiert, bis Eingabe-Daten verfügbar sind.
         *  Im Fehlerfall liefert sie -1 oder erzeugt eine Ausnahme. <br />
         *  <br />
         *  @return Das gelesene Byte (0..255) oder -1
         *  @throws IOException
         */
        public int read() throws IOException {
            return socket.getInputStream().read();
        }
        /** Lesen von Bytes vom Socket. <br />
         *  <br />
         *  Die Methode blockiert, bis Eingabe-Daten verfügbar sind.
         *  Im Fehlerfall liefert sie -1 oder erzeugt eine Ausnahme. <br />
         *  <br />
         *  @return Die Anzahl der gelesenen Bytes oder -1
         *  @param b Der Buffer
         *  @param len Maximale Anzahl der zu lesenden Bytes
         */
        public int read(byte[] b, int len) throws IOException {
            return socket.getInputStream().read(b, 0, len);
        }
        /** Lesen eines Strings vom Socket. <br />
         *  <br />
         *  Die Methode liest eine Zeile, die durch ein Zeilenendezeichen
         *  ('\n' linefeed) abgeschlossen sein muss. Der zurückgegebene
         *  String enthält die Zeile ohne Zeilenendezeichen.
         *  Die Methode blockiert, bis Eingabe-Daten verfügbar sind.
         *  Im Fehlerfall liefert sie -1 oder erzeugt eine Ausnahme. <br />
         *  <br />
         *  <br />
         *  @return Der String oder null
         *  @throws IOException
         */
        public String readLine() throws IOException {
            return reader.readLine();
        }
     
        //  --- Implementierung Schreiboperationen ---------------------------
     
        /** Schreiben eines Zeichens auf den Socket. <br />
         *  <br />
         *  Diese Methode schreibt ein Byte (die niederwertigen 8 Bit des
         *  Parameters b) auf den Socket.
         *  <br />
         *  @param b Das zu schreibende Byte (0..255)
         */
        public void write(int b) throws IOException {
            socket.getOutputStream().write(b);
        }
        /** Schreiben von Bytes auf den Socket. <br />
         *  <br />
         *  Diese Methode schreibt mehrere Bytes auf den Socket.
         *  <br />
         *  @param b Der Buffer
         *  @param len Maximale Anzahl der zu schreibenden Bytes
         *  @throws IOException
         */
        public void write(byte[] b, int len) throws IOException {
            socket.getOutputStream().write(b, 0, len);
        }
        /** Schreiben eines String auf den Socket. <br />
         *  <br />
         *  Diese Methode schreibt einen String zeichenweise auf den Socket.
         *  <br />
         *  @param s Der String
         *  @throws IOException
         */
        public void write(String s) throws IOException {
            socket.getOutputStream().write(s.getBytes());
        }
    }


    Moment mal, mein Lehrer heißt aber nicht so wie der Autor xD
    Ok dann hat mein Lehrer die Klasse wohl auch von wo anders
    Geändert von noxum (24.09.11 um 15:48 Uhr)
     

  15. #15
    SE Tutorials.de Gastzugang
    Was bitte ist das denn für ein Mist ?
    Mal davon abgesehen das du nicht in den Stream schreiben sondern nur davon lesen kannst sollte man diese Klasse wenigstens in ein Package stecken um einen FQDN zu haben damit es da keine Missverständnisse zum java.net.Socket gibt.
    Und wenn es um dein Abi geht dann solltest du gerade von solchen Custom-Zeug abstand nehmen ...
     

Ähnliche Themen

  1. Spring findet meine Methode nicht und matcht die der Superclass, warum?
    Von DarthShader im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 3
    Letzter Beitrag: 16.07.09, 12:09
  2. Compiler findet package nicht
    Von theindra im Forum Java
    Antworten: 1
    Letzter Beitrag: 09.04.05, 23:44
  3. Findet Mesh nicht an
    Von Goy im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 22.02.05, 09:59
  4. Findet Methode nicht ..
    Von teppi im Forum Java
    Antworten: 2
    Letzter Beitrag: 09.08.04, 20:31
  5. [Compiler Error C2392] "Methode": Covariant-Rückgabetypen...?
    Von pajofego im Forum VisualStudio & MFC
    Antworten: 0
    Letzter Beitrag: 24.02.04, 12:00

Stichworte