# Wert versenden?



## Ocean-Driver (10. Apr 2008)

Hallo,


Ich hab ein kleines Programm - das nur einen einzelnen Wert versenden (und zugleich empfangen) muss. Wie mach ich das am besten?Die IP des anderen Rechners ist vorhanden.


danke

gruß
ocean-driver


----------



## HoaX (10. Apr 2008)

dann wohl am besten über das ip. wo ist jetzt die konkrete frage?


----------



## tuxedo (10. Apr 2008)

Probiers mit RMI oder mit einer direkten Socketverbindung mit TCP oder UDP.

- Alex


----------



## Ocean-Driver (11. Apr 2008)

Hallo,


Ich hab mir jetzt mal nen Socket gebastelt. Nur irgendwie funktionierts nicht richtig.

Ich hab einmal eine eine "receiveData"-Klasse - die starte ich in einem Seperaten Thread und warte dort auf eine Anfrage:


```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package CommunicationSocket;

import java.io.IOException;
import java.net.Socket;

/**
 *
 * @author Ocean-Driver
 */
public class receiveData implements Runnable {
    
        private Socket client = null;
        
        
        public void run()
         {
        while(true)
        {
            try
            {
                System.out.println("Warte auf Anfrage im Server-thread..");
                
                client = Server.getInstance().getServerSocket().accept();
                CommunicationSocket.Server.getInstance().getValue(client);
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
            finally
            {
                if(client != null)
                {
                    try
                    {
                        client.close();
                    }
                    catch(IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        }
       
    }
    
}
```


Dann habe ich eine Klasse Server die den Server "verwaltet" (startet, listenerPort setzen, verarbeiten von Daten eines Sockets):


```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package CommunicationSocket;

import Controll.Status;
import java.awt.Color;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
import onlinecheck.OnlineCheckApp;


public class Server {
    
    private ServerSocket serverSocket = null;
    private Socket client = null;
    
    private int port=0;
    
    private static Server instance=null;
    
    
    
    public static Server getInstance()
    {
        if(instance==null)
        {
            instance = new Server();
        }
        
        return instance;
    }
    
    
    private Server() 
    {

    }
    
    public void startServer()
    {
        try
        {
        serverSocket = new ServerSocket(port);
        System.out.println("Server konnte gestartet werden.");
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        
    }
    
    public ServerSocket getServerSocket()
    {
        return  serverSocket;
    }
    
    public void setListenerPort(int port)
    {
        this.port = port;
    }
    
    public void getValue(Socket client) throws IOException
    {
        
    InputStream  in  = client.getInputStream(); 

    
    if(in.read() == 1)
    {   System.out.println("Signal 1 erhalten.");
        Status.setOtherOnlineStatus(true);
        onlinecheck.OnlineCheckView.LabelOtherOnlineStatus.setText("Online");
        onlinecheck.OnlineCheckView.LabelOtherOnlineStatus.setForeground(Color.GREEN);
    }
    else
    {   System.out.println("Signal 0 erhalten.");
        Status.setOtherOnlineStatus(false);
        onlinecheck.OnlineCheckView.LabelOtherOnlineStatus.setText("Offline");
        onlinecheck.OnlineCheckView.LabelOtherOnlineStatus.setForeground(Color.RED);
    }

    

    }

}
```


In der Client-Klasse versende ich den aktuellen Wert:


```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package CommunicationSocket;

import Controll.Status;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;


public class Client {

    private Socket Server = null;
    private static Client instance=null;
    
    private String host=null;
    private int port=0;
    
    public static Client getInstance()
    {
        if(instance==null)
        {
           instance = new Client();
        }

           return instance;
    }
    
    
    private Client()
    { 

    }
    
    public void initConnection()
    {
        try
        {
          System.out.println("Baue Verbindung zu " + host + ":" + port + " auf");
          Server = new Socket(host,port);

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }
    
    public void setHostAndPort(String host, int port)
    {
        this.host = host;
        this.port = port;
    }
    
    public void sendValue() 
    {
        initConnection();        
        
      try
      {
        OutputStream out = Server.getOutputStream(); 
        
      if(Status.isMeOnline())
        out.write(1);
      else
          out.write(0);
      }
      catch(Exception e)
      {
          System.out.println("Allgemeine Exception: " +e.getMessage());
      }
      finally
      {
        try
        {
           if(Server != null)
              Server.close();
           System.out.println("Schließe Verbindung!");
        }
        catch(Exception e)
        {
          System.out.println("Allgemeine Exception" +e.getMessage());
        }
      }

          
    }
    
    
    
}
```



eine Idee, warum das versenden / empfangen nicht richtig funktioniert?


Achja, meine Mainclass:


```
public static void main(String[] args) {
        
        LoadFile.loadConfig();        //lädt die Daten aus einer Konfigurationsfile

        launch(OnlineCheckApp.class, args); //grafische Oberfläche
                
        CommunicationSocket.Server.getInstance().startServer(); //Server wird gestartet
        
        Thread ServerWaitThread = new Thread(new receiveData());    //Thread zum warten auf Daten angelegt
        ServerWaitThread.start(); //Thread wird gestartet

        CommunicationSocket.Client.getInstance().initConnection(); //Verbindung wird zum Server aufgebaut

        

        
    }
```


Das Programm ist zugleich Server und Client


----------



## SlaterB (11. Apr 2008)

damit es bei mit läuft, musste ich richtigen host + port angeben (localhost, 6777)
und vor allem noch sendValue() aufrufen, passiert bei dir nirgendwo?

----------

packages unbedingt klein schreiben, und importiere doch die Klassen bzw. beim eigenen Package nicht mal nötig

> client = Server.getInstance().getServerSocket().accept(); 
>    CommunicationSocket.Server.getInstance().getValue(client); 

hier sprichst du Server mal direkt an, mal mit CommunicationSocket.Server,
das ist schlimm,


----------



## tuxedo (11. Apr 2008)

Und fast noch schlimmer ist dass es zu "geht nicht richtig" keine Fehlermeldung gibt.....


----------



## Ocean-Driver (11. Apr 2008)

Hi,

Ja, send Value wird aufgerufen - in dem Event was aktiviert wird, wenn ich die Checkbox de/aktiviere.


```
if(CheckBoxMeOnlineStatus.isSelected())
       {
           LabelMeOnlineStatus.setText("Online");
           LabelMeOnlineStatus.setForeground(Color.GREEN);
           
       }
       else
       {
           LabelMeOnlineStatus.setText("Offline");
           LabelMeOnlineStatus.setForeground(Color.RED);
       }
       
       Status.setMeOnlineStatus(CheckBoxMeOnlineStatus.isSelected());
       
       Client.getInstance().sendValue();
```


Den richtigen Port habe ich angegeben, der wird über die Methode loadConfig(); in loadFile{} gesetzt. 

Es gibt garkeine Fehlermeldung. Nur irgendwie empfängt der Server nichts, wenn ich sendValue(); aufrufe


----------



## SlaterB (11. Apr 2008)

tja, ich kann nur beurteilen, was als Code vorliegt,
wenn darin was fehlt und du meinst, das steht an anderer Stelle korrekt, nun gut 

noch 2 Tipps:
1.
schreibe eine System.out.println()-Ausgabe in sendValue(); vor dem Senden,
vielleicht wirds doch nicht ausgeführt (keine Ausgabe)

2. 
schaue dir meinen funktionierenden Code an, vielleicht hilfts irgendwo


```
public class Server
{
    private ServerSocket serverSocket = null;
    private int port = 6777;
    private static Server instance = null;

    public static Server getInstance()
    {
        if (instance == null)
        {
            instance = new Server();
        }
        return instance;
    }

    private Server()
    {
    }

    public void startServer()
    {
        System.out.println("startServer begin");
        try
        {
            serverSocket = new ServerSocket(port);
            System.out.println("Server konnte gestartet werden.");
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        System.out.println("startServer end");
    }

    public ServerSocket getServerSocket()
    {
        return serverSocket;
    }

    public void setListenerPort(int port)
    {
        this.port = port;
    }

    public void getValue(Socket client)
        throws IOException
    {
        InputStream in = client.getInputStream();
        if (in.read() == 1)
        {
            System.out.println("Signal 1 erhalten.");
        }
        else
        {
            System.out.println("Signal 0 erhalten.");
        }
    }

    public static void main(String[] args)
    {
        Server.getInstance().startServer(); // Server wird gestartet
        Thread ServerWaitThread = new Thread(new receiveData()); // Thread zum warten
        // auf Daten angelegt
        ServerWaitThread.start(); // Thread wird gestartet
        Client.getInstance().initConnection(); // Verbindung wird zum Server aufgebaut
        Client.getInstance().sendValue();
    }
}

class Client
{
    private Socket Server = null;
    private static Client instance = null;
    private String host = "localhost";
    private int port = 6777;

    public static Client getInstance()
    {
        if (instance == null)
        {
            instance = new Client();
        }
        return instance;
    }

    private Client()
    {
    }

    public void initConnection()
    {
        try
        {
            System.out.println("Baue Verbindung zu " + host + ":" + port + " auf");
            Server = new Socket(host, port);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public void setHostAndPort(String host, int port)
    {
        this.host = host;
        this.port = port;
    }

    public void sendValue()
    {
        initConnection();
        try
        {
            OutputStream out = Server.getOutputStream();
            System.out.println("write 1");
            out.write(1);            
        }
        catch (Exception e)
        {
            System.out.println("Allgemeine Exception: " + e.getMessage());
        }
        finally
        {
            try
            {
                if (Server != null) Server.close();
                System.out.println("Schließe Verbindung!");
            }
            catch (Exception e)
            {
                System.out.println("Allgemeine Exception" + e.getMessage());
            }
        }
    }
}

class receiveData
    implements Runnable
{
    private Socket client = null;

    public void run()
    {
        while (true)
        {
            try
            {
                System.out.println("Warte auf Anfrage im Server-thread..");
                client = Server.getInstance().getServerSocket().accept();
                Server.getInstance().getValue(client);
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            finally
            {
                if (client != null)
                {
                    try
                    {
                        client.close();
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
```


----------



## Ocean-Driver (11. Apr 2008)

Hi,


Ich hab oben die Methode stehen, die sendValue() aufruft.
Ich hab auch mal nen System.Out im sendValue() eingefügt, und er sendet auch immer 0 bsp. 1 - die daten sind auch richtig, ich mein - es kommt zu ner Verbindung. - aber nur das versenden klappt irgendwie nicht.

Ich hab deinen Code mit meinem vergleichen, finde aber auch keine großartigen Ändernungen (außer das du halt die Variablen direkt gesetzt hast)


----------



## Kampfidaggel (11. Apr 2008)

Der Code von Slater funktioniert erst, wenn du
Client.getInstance().initConnection();
aus Server.main() rausnimmst, da er sonst zweimal initConnection ausführt (einmal in sendValue(), und einmal in Server.main()).


----------



## SlaterB (12. Apr 2008)

hmm, verrückt, dann hats ja vorher gar nicht funktioniert,
ich habe wohl nur auf die 'Schließe Verbindung!'-Meldung nach Einbau von sendValue() geachtet 

mit nur einmal initConnection(); läuft es wesentlich besser, ja


----------



## Pappenheimer++ (12. Apr 2008)

Falls das Problem immernoch existiert und sich deinem Verständnis enzieht, benutz doch mal Wireshark. Damit hast du dann den "totalen Überblick"


----------



## Ocean-Driver (12. Apr 2008)

Danke jungs, es funktioniert jetzt


----------

