wieder socket probleme



  • folgendes Problem. . Ich möchte Objekte Zentral auf dem Server verwalten. Die Objekte, die sich auf dem server befinden, lassen sich über einen Menupunkt anzeigen. Der Ablauf ist folgendermassen:
    Wird der Menupunkt angewählt so wird ein String ("GetObject") zum SERVER geschickt. Der SERVER sendet alle Namen der einzelnen Objekte zurück. Diese werden dann im Menu angezeigt.

    kleiner ausschnitt aus dem Programm

    Wenn der Menupunkt Networklevel ausgewählt wird sollen alle levels die sich auf dem SERVER befinden angezeigt werden.

    public GameMenu(Visu visu) {
        m_oVisu = visu
    
        try{
           InetAddress adr = InetAddress.getByName("192.168.1.5");
            c = new Client(adr,4000);
            s = new Server(4000);                     					//initalisierung als normales Objekt
            //s.start();
          }catch(UnknownHostException e){
            System.err.println(e.toString());
          }
    
    .
    .
    .
    .
    
    if (sTemp.equals("Network")) {
            c.sendObject("GetObjekt");                      				   //client
            m_oChoose = new ChooseDialog(m_oVisu);
            s.run();                                                                                                       //startet Serversocket (ist kein Thread!)
            m_oChoose.setNames((String[])s.getObject());
            m_oChoose.OpenDialog();                                                           // Anzeige aller Levels
    

    Ausschnitt aus der Klasse Client (verantwortlich für das senden von Objekten)

    public void sendObject(Object obj) {
    
        try {
          ObjectOutputStream out;
          out = new ObjectOutputStream(m_oSocket.getOutputStream());
          out.writeObject(obj);
          out.close();
          m_oSocket.close();
    
        }
        catch (IOException e) {
          System.err.println(e.toString());
        }
      }
    }
    

    Ausschnitt aus der Klasse Server (verantwortlich für das empfangen der Objekte)

    public class Server{       // extends Thread{                        //Test: Server als Thread gestartet
    
       private int m_iPortNr;
       private Object m_oObj;
       private ServerSocket m_oServerSocket;
    
      public Server(int portNr) {
        m_iPortNr = portNr;
    
      }
    
      public void run(){
        try{
          // init Server socket
          m_oServerSocket = new ServerSocket(m_iPortNr);
    
         // while(true){
           Socket socket = m_oServerSocket.accept();
           System.out.println(socket.getInetAddress().getHostAddress());
           m_oObj = reciveData(socket);
          //}
          }catch (IOException e){
             System.err.println(e.toString());
           }
      }
    
     private Object reciveData(Socket socket){
    
       Object ret = null;
    
       try{
          ObjectInputStream in;
          in = new ObjectInputStream(socket.getInputStream());
          ret = in.readObject();
          System.out.println(ret.getClass()+ " empfangene classe");
    
          in.close();
          socket.close();
    
        }catch (IOException e){
          System.err.println(e.toString());
        } catch (ClassNotFoundException e) {
         System.err.println(e.toString());
       }
     return ret;
    
     }
     public Object getObject(){
        return m_oObj;
      }
    

    Folgendes Problem : Wenn ich die Klasse Server als Thread laufenlasse wartet das Programm nicht mehr auf die Antwort des Servers und es wird eine NullPointerException geworfen.

    Wenn ich die Klasse Server als normales Objekt initialisiere wartet es zwar auf die Antwort vom SERVER. aber sobald ich ein zweites mal versuche den Menupunkt "Networklevel" anzuwählen bekomme ich eine java.net.BindException: Address already in use: JVM_Bind

    wie kann ich diese probleme lösen????



  • Seit dem JDK1.4 kann dieses Problem unter Verwendung von setReuseAddress umgangen werden.

    oServerSocket = new ServerSocket();
    oServerSocket .setReuseAddress(true);
    oServerSocket .bind(new InetSocketAddress(m_iPortNr));
    
    m_oServerSocket = new ServerSocket(m_iPortNr); 
    
    Socket socket = m_oServerSocket.accept();
    

    Geht aber erst ab JDK 1.4. Darunter musst du einfach eine /mir unbekannte) Zeit warten, bis der Port wieder vom OS freigegeben wird.

    /Dirk


Anmelden zum Antworten