WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 24.04.2003, 17:24   #1
blauesau
Hero
 
Registriert seit: 08.04.2003
Beiträge: 821


Frage Sockets und Java

So, nun mal eine Frage zu Sockets...

Ich habe eine Endlosschleife mit der ich auf einkommende Verbindungen warte:

Code:
while(true) {
   socket = new ServerSocket(port);
   new MSSClientThread(instances++, socket).start();
}
Der Thread soll nun so lange laufen, bis der Client die Connection geschlossen hat, oder ein gewisses Timeout abgelaufen ist.

Doch wie stelle ich in dem Thread fest, ob der Client seine Connection geschlossen hat, oder nicht???

Code:
public void run() {
   System.out.println("Verbindung aufgebaut: " + instance);

   while(true) {
      try {
         //irgendwas machen...

         if(KEINE VERBINUNG MEHR) {
            socket.close();
            break; //Thread beenden
         }
      }
      catch(Exception ex) {}
   }
}
blauesau ist offline   Mit Zitat antworten
Alt 24.04.2003, 17:59   #2
blauesau
Hero
 
Registriert seit: 08.04.2003
Beiträge: 821


Standard

Und noch eine Frage hätte ich:

Wie übertrage ich ein ganzes OBJEKT über eine Socketverbindung? Auf der Clientseite müsste ein Objekt erstellt, zum Server geschickt und von diesem 1:1 repliziert werden können, so dass dieser dann Eigenschaften aus diesem Objekt auslesen, bzw auf Methoden zugreifen kann...

Kann mir da wer helfen?
blauesau ist offline   Mit Zitat antworten
Alt 24.04.2003, 19:06   #3
Tarjan
Quantensingularität
 
Registriert seit: 28.09.2000
Alter: 55
Beiträge: 8.336


Tarjan eine Nachricht über ICQ schicken
Standard

Ad 1) schon mal mit der Methode isConnected() der Klasse Socket versucht?

Mit den beiden Methoden getOutputStream() und getInputStream() bekommst du einen Input- bzw Output Stream. Direkte Subklassen von denen ist ObjectInputStream bzw. ObjektOutputStream mittels denen du Objekte serialisieren kannst solange sie das Interface Serializable implementieren. Und damit kannst du Objekte über Sockets verschicken.

Siehe dazu auch: http://java.sun.com/docs/books/tutor...ngWriting.html
bzw. das ganze Tutorial über Sockets: http://java.sun.com/docs/books/tutor...ets/index.html
____________________________________
Was ist klein, grün und dreieckig?
Ein kleines grünes Dreieck!


Bahnübergänge sind die härtesten Drogen der Welt! Ein Zug und du bist weg!
Tarjan ist offline   Mit Zitat antworten
Alt 24.04.2003, 19:12   #4
blauesau
Hero
 
Registriert seit: 08.04.2003
Beiträge: 821


Standard

Da bin ich auch kurz nach dem Posten draufgekommen , aber es gibt eh immer noch ein (ok, wäre schön, wenn es nur eines wäre... ) Problem:

Sagen wir ich verschick ein Objekt vom Typ JPanel... Alles kein Problem, NUR... wie mach ich auf der Empfängerseite wieder ein JPanel draus?

Ich habe es mit
Code:
    JPanel o = (JPanel) oinput.readObject();
                        ^^^^^^
                        ObjectInputStream
und dergleichen versucht, das hat aber leider nicht wirklich funktioniert...

Wenn man aber
Code:
    System.out.println(oinput.readObject());
ausführt, stellt man fest, dass das Versenden an und für sich schon funktioniert...
blauesau ist offline   Mit Zitat antworten
Alt 24.04.2003, 19:35   #5
Tarjan
Quantensingularität
 
Registriert seit: 28.09.2000
Alter: 55
Beiträge: 8.336


Tarjan eine Nachricht über ICQ schicken
Standard

Habe mir das mal kurz ind der Java API angeshen. An und für sich müsste es genauso funktionieren. JPanel ist Serializable, und mittels readObject bekommst auch das Objekt.

Was funktioniert denn nicht?

Versuche erst einmal einfacher Objekte (Value Objekte wie zB. eine HashMap mit Werten) zu verschiocken. Da kannst du die Werte direkt überprüfen.
____________________________________
Was ist klein, grün und dreieckig?
Ein kleines grünes Dreieck!


Bahnübergänge sind die härtesten Drogen der Welt! Ein Zug und du bist weg!
Tarjan ist offline   Mit Zitat antworten
Alt 24.04.2003, 20:42   #6
blauesau
Hero
 
Registriert seit: 08.04.2003
Beiträge: 821


Standard

Ich glaub's nicht... Aufeinmal funktioniert das und ich hab (glaub ich *g*) nichts verändert...

Vorher hat er sich zur Laufzeit furchtbar echauffiert, er könne dieses Objekt nicht casten...

Tjo...

Vielen Dank jedenfalls. Und keine Angst, ich komme wieder!
blauesau ist offline   Mit Zitat antworten
Alt 24.04.2003, 21:15   #7
blauesau
Hero
 
Registriert seit: 08.04.2003
Beiträge: 821


Standard

Langsam wird mir die Fragerei peinlich...

Erstmal Code (Kot?):

Code:
import java.net.*;
import java.io.*;
import javax.swing.*;

public class MSSClientThread
    extends Thread {
  protected int instance;
  protected Socket socket;

  public MSSClientThread(int inst, Socket sock) {
    instance = inst;
    socket = sock;
  }

  public void run() {
    InputStream input = null;
    ObjectInputStream oinput = null;

    System.out.println("(" + instance + ") Verbindung aufgebaut");

    try {
      input = socket.getInputStream();
      //oinput = new ObjectInputStream(input);
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }

    while (true) {
      try {
        oinput = new ObjectInputStream(input);
        
        JPanel o = (JPanel) oinput.readObject();

        System.out.println("(" + instance + ") " + o.getLocation().x);

        if (input.read() == -1) {
          System.out.println("(" + instance + ") Verbindung beendet");
          socket.close();
          break;
        }
      }
      catch (Exception ex) {
        ex.printStackTrace();
        break;
      }
    }
  }
}
Was hätte ich gerne? Der Client schickt an diesen Thread ein Objekt (in diesem Fall, beispielsweise vom Typ JPanel, wie auch immer...). Der Server (Thread) liest die x-Koordinate aus und gibt sie aus. Dann soll er auf weitere Incomings warten, bis es zu einer Abbruchbedingung kommt. Funktioniert auch - aber nur einmal! Versuche ich mit dem Client noch einmal zu senden, kommt es beim Server zu dieser Fehlermeldung:

Code:
java.io.StreamCorruptedException: invalid stream header
	at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:737)
	at java.io.ObjectInputStream.<init>(ObjectInputStream.java:253)
	at sic.MSSClientThread.run(MSSClientThread.java:39)
MSSClientThread.java:39 bezieht sich dabei auf die rot eingefärbte Zeile...
blauesau ist offline   Mit Zitat antworten
Alt 25.04.2003, 12:30   #8
Flink
Hero
 
Registriert seit: 29.08.2001
Alter: 57
Beiträge: 904


Flink eine Nachricht über ICQ schicken Flink eine Nachricht über Skype™ schicken
Standard

Unter Java-API steht, dass der Client den Header 'has written and flushed the header' . Offenbar hat der Client den Header nicht ganz rausgeschrieben, was man in diesem Listing aber nicht sieht.
____________________________________
Bibel
Flink ist offline   Mit Zitat antworten
Alt 25.04.2003, 13:10   #9
blauesau
Hero
 
Registriert seit: 08.04.2003
Beiträge: 821


Standard

Hi!

Der Client-Code sieht ungefähr so aus:

Verbindung herstellen
Code:
void jButton1_actionPerformed(ActionEvent e) {
    try {
      socket = new Socket("localhost", 5190);
    }
    catch (IOException ex) {
      ex.printStackTrace();
    }
  }
Objekt senden
Code:
  void btnSend_actionPerformed(ActionEvent e) {
    JPanel objekt = new JPanel();

    objekt.setLocation(10,10);
    try {
      out = socket.getOutputStream();
      oout = new ObjectOutputStream(out);

      //ObjectOutputStream oout = socket.getOutputStream();
      oout.writeObject(objekt);
      //oout.writeObject(null);
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }
blauesau ist offline   Mit Zitat antworten
Alt 25.04.2003, 13:23   #10
blauesau
Hero
 
Registriert seit: 08.04.2003
Beiträge: 821


Standard

Die Methode run() vom Server-Thread:

Code:
public void run() {
    InputStream input = null;
    ObjectInputStream oinput = null;

    System.out.println("(" + instance + ") Verbindung aufgebaut");

    try {
      input = socket.getInputStream();
      oinput = new ObjectInputStream(input);
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }

    JPanel o;

    Object ob = null;
    try {
      while (true) {
        if ((ob = oinput.readObject()) == null) {
          System.out.println("NULL");
          break;
        }
        else {
          System.out.println(ob.toString());
          oinput = new ObjectInputStream(input);
        }

      }

      System.out.println("(" + instance + ") Verbindung beendet");
      oinput.close();
      input.close();
      socket.close();

    }
    catch (Exception ex1) {
      ex1.printStackTrace();
      //System.out.println(ob.toString());
    }
  }
blauesau ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:57 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag