Pascal: Klasse Socket erweitern

Hallihallo,

ich hab die Klasse Socket um einige Strings erweitert, damit ich noch zusätzliche Daten übers Netz hin- und her jagen kann.

a) funktioniert das überhaupt?
b) Wenn ich dann auf der anderen Seite ein ServerSocket habe und einen Client "akzeptiere", dann gibt mir das ein normales Socket zurück. Kann ich dieses irgendwie in mein erweitertes Socket umwandeln? Oder dafür sorgen, dass ein erweitertes Socket zurück kommt?

Liebe Grüsse Pascal

  1. Hallo!

    ich hab die Klasse Socket um einige Strings erweitert, damit ich noch zusätzliche Daten übers Netz hin- und her jagen kann.

    Weiss zwar nicht genau, was du meinst, aber wenn du das gemacht hast! ;-)

    a) funktioniert das überhaupt?

    Du hast es doch gemacht? Dann sollte es doch gehen, oder?

    b) Wenn ich dann auf der anderen Seite ein ServerSocket habe und einen Client "akzeptiere", dann gibt mir das ein normales Socket zurück. Kann ich dieses irgendwie in mein erweitertes Socket umwandeln? Oder dafür sorgen, dass ein erweitertes Socket zurück kommt?

    Schonmal von Casting gehört?

    Ciao,
    Andy

    1. Hallo,

      b) Wenn ich dann auf der anderen Seite ein ServerSocket habe und einen Client "akzeptiere", dann gibt mir das ein normales Socket zurück. Kann ich dieses irgendwie in mein erweitertes Socket umwandeln? Oder dafür sorgen, dass ein erweitertes Socket zurück kommt?

      Schonmal von Casting gehört?

      Er kann das nicht casten. Er kriegt ein Objekt vom Typ "Socket" zurück.
      Das kann er nicht in ein beliebiges anderes spezialisierteres Objekt
      casten.
      Er könnte es nur dann casten, wenn die Methode in Wirklichkeit ein
      MySpecialToken-Objekt zurückgibt, was sie nicht tut.

      Gruß
      Slyh

      1. Hallo!

        Schonmal von Casting gehört?

        Er kann das nicht casten. Er kriegt ein Objekt vom Typ "Socket" zurück.
        Das kann er nicht in ein beliebiges anderes spezialisierteres Objekt
        casten.

        Kann sein, das ich mich auch täusche, also nicht gleich sauer sein! ;-)
        Aber hat er nicht sowas:
        class MySocket extends Socket {
        }
        ServerSocket gibt jetzt ein Socket zurück, dann kann man doch schreiben:
        MySocket mySocket = socket;

        Ist klar das nur die ursprünglichen Eigenschaften von Socket da sind, aber möglich ist es doch?

        Sorry nochmal, falls ich mich täusche, habe bestimmt bald ein halbes Jahr kein Java mehr gehackt!

        Ciao,
        Andy

        1. Hallo Andy,

          MySocket mySocket = socket;

          Nein, da würde schon der Kompiler einen Fehler ausgeben.
          Was geht, ist z.b. so etwas:

          Socket socket = new MySocket();

          Wenn Du nun wieder auf die Eigenschaften von MySocket zugreifen willst, kannst Du casten:

          ((MySocket)socket).mySocketMethode();

          Casting von Objekten ist keine Umwandlung. Es ist lediglich ein Hinweis an den Kompiler, dass Du weist, dass es sich um die Instanz einer bestimmten Klasse handelt.

          (A)obj funktioniert also genau dann, wenn obj instanceof A wahr ist.

          Grüße

          Daniel

          1. Hallo Daniel!

            Socket socket = new MySocket();

            Okay! So rum funktioniert es!
            Hab' ja gesagt, hab' lang kein Java mehr gehackt! ;-)
            Danke!

            Ciao,
            Andy

  2. Hallo,

    ich hab die Klasse Socket um einige Strings erweitert, damit ich noch zusätzliche Daten übers Netz hin- und her jagen kann.

    Verstehe ich nicht. Was für eine Erweiterung hast du gemacht? Wozu?

    Deine Fragen und Aussagen sind -- wie schon weiter unten -- sehr
    schwammig. Wenn du sinnvolle Antworten haben möchtest, solltest
    du deine Probleme sehr viel genauer beschreiben.

    a) funktioniert das überhaupt?

    Klar kannst du Klassen ableiten und eigene Funktionalität hinzufügen.

    b) Wenn ich dann auf der anderen Seite ein ServerSocket habe und einen Client "akzeptiere", dann gibt mir das ein normales Socket zurück. Kann ich dieses irgendwie in mein erweitertes Socket umwandeln? Oder dafür sorgen, dass ein erweitertes Socket zurück kommt?

    Nein. (Zumindest würde mir jetzt keine sinnvolle Möglichkeit einfallen.)

    Du könntest aber einen Adapter bauen, der die erweiterten Aufruf-
    möglichkeiten transparent auf den Default-Socket abbildet.
    (Guck mal in einem beliebigen Buch über Design Pattern nach dem
    Adapter-Pattern.)

    http://www.vico.org/pages/PatronsDisseny/Pattern Adapter Object/

    Falls du das nicht verstehst, frag bitte einfach nochmal nach.

    Gruß
    Slyh

  3. Hallo!

    Also, Danke einmal für die Antworten. Es geht darum, dass ich eine Art Chat am programmieren bin. Es gibt ein normales Socket für jeden Client, ein ServerSocket für den Server. Die Kommunikation funktioniert.

    Das Problem ist nun, dass es eben auch noch andere Daten als Text gibt, welche übergeben werden sollen. So soll zum Beispiel die Liste der Online-Benutzer auf jedem Client aktualisiert werden, sobald ein neuer Client hinzukommt. Da ich die Liste in einem Vector gespeichert habe und auf dem Server verwalte, möchte ich diese dann jeweils an die Clients senden damit jeder Client seine Benutzerliste aktualisiert.

    Da ich ja den DataInputStream und DataOutputStream bereits für den Texttransport (den die User beim Chatten eingeben) benutze, kann ich ja nicht auch noch gleichzeitig einen Vector mit den Benutzer über diesen Stream versenden - Ich wüsste auf jeden Fall nicht wie.

    Drum dachte ich, ich könnte ja das Socket z.B. um Strings und Vektoren erweitern...

    Vielleicht hat ja sonst jemand eine Idee wie man das lösen könnte?

    Gruss Pascal

    1. Hallo!

      Das Problem ist nun, dass es eben auch noch andere Daten als Text gibt, welche übergeben werden sollen. So soll zum Beispiel die Liste der Online-Benutzer auf jedem Client aktualisiert werden, sobald ein neuer Client hinzukommt. Da ich die Liste in einem Vector gespeichert habe und auf dem Server verwalte, möchte ich diese dann jeweils an die Clients senden damit jeder Client seine Benutzerliste aktualisiert.

      Da ich ja den DataInputStream und DataOutputStream bereits für den Texttransport (den die User beim Chatten eingeben) benutze, kann ich ja nicht auch noch gleichzeitig einen Vector mit den Benutzer über diesen Stream versenden - Ich wüsste auf jeden Fall nicht wie.

      Verwende doch lieber eine ObjectOutputStream und ObjectInputStream, da kannst du eigentlich alles (?) drüber jagen! Dann kannst du Vector verschicken oder String!
      Das wäre, was mir einfallen würde! Ist auf jeden Fall besser als erweiterter Socket.
      Hab' aber noch nichts in der Richtung gemacht! Vielleicht kann die Slyh weiterhelfen!

      Ciao,
      Andy

      1. Hallo,

        Das Problem ist nun, dass es eben auch noch andere Daten als Text gibt, welche übergeben werden sollen. So soll zum Beispiel die Liste der Online-Benutzer auf jedem Client aktualisiert werden, sobald ein neuer Client hinzukommt. Da ich die Liste in einem Vector gespeichert habe und auf dem Server verwalte, möchte ich diese dann jeweils an die Clients senden damit jeder Client seine Benutzerliste aktualisiert.

        Da ich ja den DataInputStream und DataOutputStream bereits für den Texttransport (den die User beim Chatten eingeben) benutze, kann ich ja nicht auch noch gleichzeitig einen Vector mit den Benutzer über diesen Stream versenden - Ich wüsste auf jeden Fall nicht wie.
        Verwende doch lieber eine ObjectOutputStream und ObjectInputStream, da kannst du eigentlich alles (?) drüber jagen! Dann kannst du Vector verschicken oder String!
        Das wäre, was mir einfallen würde! Ist auf jeden Fall besser als erweiterter Socket.

        Dem kann ich nur zustimmen. Der Socket ist ja nur quasi der Endpunkt der IP-Verbindung. Die eigenetliche Kommunikation geschieht über Streams. Deshalb musst Du auch hier ansetzen. Also entweder InputStream/OutputStream erweitern oder wie gesagt ObjectInputStream bzw. ObjectOutputStream verwenden.

        Gruß
          MichaelB

        1. Hallo

          Verwende doch lieber eine ObjectOutputStream und ObjectInputStream, da kannst du eigentlich alles (?) drüber jagen! Dann kannst du Vector verschicken oder String!

          ...und wie unterscheid ich dann, ob es sich um Text handelt den ein User eingetippt hat und nun einfach unverarbeitet an einem anderen Ort wieder ausgegeben werden muss, oder ob es sich um Daten handelt, welche im Code verarbeitet werden müssen?

          Gruss Pascal

          1. Hallo Pascal!

            ...und wie unterscheid ich dann, ob es sich um Text handelt den ein User eingetippt hat und nun einfach unverarbeitet an einem anderen Ort wieder ausgegeben werden muss, oder ob es sich um Daten handelt, welche im Code verarbeitet werden müssen?

            Ich denk mal du liest im ObjectInputStream das nächste anstehende Objekt mit readObject() ein und prüfst dann mit instanceof nach zu was es gehört (zu String oder Vector).

            Ciao,
            Andy

    2. Hallo Pascal,

      Da hilft es Dir nicht, die Socket-Klasse zu erweitern.
      Über eine TCP/IP Verbindung hast Du eben nur einen Datenstrom in jede Richtung.
      Du musst Dir eine Protokoll entwerfen, dass Deinen Anforderungen entspricht.

      Du kannst natürlich auch eines implementieren, dass es schon gibt.
      Für eine Chatanwendung wären da z.b. irc oder jabber geeignet.

      Grüße

      Daniel

  4. b) Wenn ich dann auf der anderen Seite ein ServerSocket habe und einen Client "akzeptiere", dann gibt mir das ein normales Socket zurück. Kann ich dieses irgendwie in mein erweitertes Socket umwandeln? Oder dafür sorgen, dass ein erweitertes Socket zurück kommt?

    Kannst Du das "normale" Socket nicht dem Konstruktur von Deinem HyperSpecialSocket übergeben, und dort verwurschteln?