# Problem bzgl. Sockets / Server-Client-Struktur



## SimonSocket (5. Jan 2010)

Hallo,

ich habe folgendes Ziel mit meinem Java-Programm:

1. Server & Client sollen per Socket(s) Daten austauschen, sprich: Server wird gestartet, wartet (listened) auf Daten vom Client

2. Client wird nach Server gestartet, teilt diesem mit der er nun da ist (ohne irgendwelche Daten zu schicken, soll dem Server nur mitteilen, dass er nun da ist und nun mit Server Daten austauschen kann... quasi einfach "Hallo" sagen)

3. Server schickt Daten an Client (in meinem Fall erstmal nur 2 Zahlen, die addiert werden sollen [12+10])

4. Client empfängt Daten vom Server, addiert die beiden Zahlen und gibt das Ergebnis zurück [12 + 10 = 22]

5. Server bekommt Ergebnis, gibt dies über Console aus und wartet anschließend auf neue Anfragen vom Client

Dazu habe ich jeweils folgenden Quellcode für Client und Server geschrieben:

Code Server:
------------

```
import java.net.*;
import java.io.*;

public class kleinerServer {

	  ServerSocket server = new ServerSocket (7583);
	  MiniServer () throws IOException {
	  while (true) {
	  Socket client = server.accept();
	  InputStream input = client.getInputStream();
	  OutputStream output = client.getOutputStream();
	  output.write ( 12 );
	  output.write ( 10 );		  
	  output.flush(); // alle Bytes im Puffer abschicken
	  System.out.println( input.read () );
	  input.close();
	  output.close();
	  server.close();

	  }
}


public static void main (String args[]) {

	try {
		kleinerServer server = new kleinerServer();
	    }

	catch (IOException e) 
	    {
		System.out.println(e);
	    }
	}
}
```
Code Client:
-----------

```
public class Client () throws IOException {
  			
  		  Socket server = new Socket ("localhost", 7583);
  		  InputStream input = server.getInputStream();
  		  OutputStream output = server.getOutputStream();
  		  int zahl1 = input.read();
  	 	  int zahl2 = input.read();
  		  output.write (zahl1+zahl2);
  		  output.flush();
  		  input.close();
  		  output.close();
		  
  }	
	  
  
public static void main (String args[]) {

		try {
			Client client = new Client();
		    }

		catch (IOException e) 
		    {
			System.out.print(e);
		    }
}
```



Nun habe ich folgendes Problem:

Es wird immer nur die erste Zahl über die Konsole ausgegeben (die 12), aber nicht das addierte Ergebnis (22). Außerdem scheint trotz flush() der Puffer nicht immer gelehrt zu werden, in einem ersten Versuch habe ich statt 12 als erste Zahl 5 genommen und manchmal kommt bei mir immer noch die 5 als Ausgabe in der Konsole.

Suche schon seit gut einer Stunde meinen Fehler im Quellcode, aber derzeit scheine ich etwas betriebsblind zu sein, zumindest haben mich alle meinen eigenen Lösungsversuche bisher leider nicht zum Ziel gebracht.

Würde mich sehr freuen, wenn mir jemand weiterhelfen kann! Vielen Dank im Voraus für eure Hilfe!


----------



## SimonSocket (5. Jan 2010)

Kleiner Nachtrag:

In Zeile 6 des Server-Codes muss es natürlich statt

[JAVA=6]"MiniServer () throws IOException {" [/code]

heißen

[JAVA=6]"kleinerServer () throws IOException {" [/code]

Sorry, hab den Fehler im Posting/Quellcode eben erst gesehen, aber das behebt mein grundsätzliches Problem leider auch nicht...


----------



## SlaterB (5. Jan 2010)

```
public class Test {
    public static void main(String[] args) throws Exception {

        Runnable r = new Runnable()     {
                public void run()   {
                    try     {
                        kleinerServer server = new kleinerServer();
                    }  catch (Exception e)   {
                        throw new RuntimeException(e);
                    }
                }
            };
        new Thread(r).start();

        Thread.sleep(2000);
        Client client = new Client();
    }
}

class kleinerServer {
    kleinerServer() throws IOException {
        ServerSocket server = new ServerSocket(7583);
        while (true)   {
            Socket client = server.accept();
            InputStream input = client.getInputStream();
            OutputStream output = client.getOutputStream();
            output.write(12);
            output.write(10);
            output.flush(); // alle Bytes im Puffer abschicken
            System.out.println(input.read());
            input.close();
            output.close();
        }
    }
}

class Client {
    public Client()   throws IOException  {
        Socket server = new Socket("localhost", 7583);
        InputStream input = server.getInputStream();
        OutputStream output = server.getOutputStream();
        int zahl1 = input.read();
        int zahl2 = input.read();
        output.write(zahl1 + zahl2);
        output.flush();
        input.close();
        output.close();
    }
}
```
läuft in einem Programm, habe 
server.close();
rausgenommen, sonst gibts ne Exception

Ausgabe 22 bei mir, da fällt mir nix zu ein


----------



## SimonSocket (5. Jan 2010)

Dank dir für deine schnelle Antwort!

Wenn ich es jetzt als eine Java-Datei ausführe, funktioniert es bei mir auch. Wenn ich es allerdings in mein OSGi-Framework mit Eclipse übertrage, dann funzt es leider nicht mehr...

Naja, OSGi is leider mit seiner Bundle-/Package-Struktur doch um einiges vertrackter... :-/


----------

