# Variablen an Server senden



## Bruegge (6. Feb 2006)

Hallo!
Ich habe folgendes Problem:
Ich möchte ein Programm schreiben, welches auf 5 verschiedenen PC's im Netzwerk läuft und Daten an ein Serverprogramm sendet. Wenn das Serverprogramm diese erhält, sendet er sie an die anderen 4. 
Das Problem ist, dass ich nicht weiß wie ich andere Daten (Außer Integers) sende / empfange... 
Ich habe mir bereits ein Beispiel in diesem Forum angeschaut:

Server:

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

public class Server {
	
	public Server() {
		try
	    {
		ServerSocket server = new ServerSocket( 3141 );

	    while ( true )
	    {
	    	Socket client = server.accept();
	    	
	    	InputStream  in  = client.getInputStream();
	    	OutputStream out = client.getOutputStream();
	    	
	    	int start = in.read();
	    	int end = in.read();
	    	
	    	int result = start * end;
	    	out.write( result );
	    	
	    	client.close();
	    }
	    }
		catch ( IOException e ) {
			System.out.println( "Fehler" );
		}
	}
	
	
	public static void main( String args[] ) {
	    new Server();
	}
}
```

Client:

```
try
{
  Socket server = new Socket ( "localhost", 3141 );

  InputStream in = server.getInputStream();
  OutputStream out = server.getOutputStream();
  
  out.write( 4 );
  out.write( 9 );

  int result = in.read();
  System.out.println( result );

  server.close();
}
catch ( IOException e ) {
  System.out.println( "Fehler" );
}
```

Dieses Programm Multipliziert 2 Integer und gibt den Wert zurück... Mein Programm soll ähnlich aussehen, nur dass ich keine integer verwenden will, sondern beliebige Variablen (am besten selbstdefinierte Klassen)


Vielen Dank schon im Voraus,

Christian


----------



## blubb (6. Feb 2006)

jetzt mal aus der huefte geschossen:

mach deine objecte serializable und wrappe ein ojectstream um deinem socket.


----------



## Brügge (6. Feb 2006)

Hättest du vielleicht einen kleinen BeispielCode, da ich mich erhlich gesagt erst seit kurzem mit Netzwerkprgrammierung befasst habe ^^

Danke sehr,
Christian


----------



## blubb (7. Feb 2006)

nein hab ich nicht.
lies ein buch oder wenigstens die docs.


----------



## Brügge (8. Feb 2006)

Okay... dann versuch ich's nochmal so .... aber eine Frage hätt ich noch: Was ist ein Objectstream? 

Christian


----------



## Brügge (9. Feb 2006)

Ich bin jetzt glaub ich schon mal etwas weiter: Ich kann aber immer noch keine eigenen Objekte senden / empfangen, und der server meldet einen fehler wenn ich ein objekt sende, heir der Code:

SERVER:

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

public class Server {
	private int test;
	
	public Server() {
		try
	    {
			  ServerSocket serv = new ServerSocket(3141);
			  Socket client = serv.accept();

			  ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
			  ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());

			  test = ois.readInt();
			  System.out.println(test);
	    }
		catch ( IOException e ) {
			System.out.println( "Server Fehler" );
		}
	}
	
	
	public static void main( String args[] ) {
	    new Server();
	}
}
```

CLIENT:

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

public class testClient {
	int test = 100;
	
	public testClient() {
	try
	    {
			Socket server = new Socket ( "localhost", 3141 );

			ObjectOutputStream oos = new ObjectOutputStream(server.getOutputStream());
			ObjectInputStream ois = new ObjectInputStream(server.getInputStream());

			
			oos.writeInt(Spielerzahl);
			
			//Object o = ois.readObject();
			
			
		    server.close();
	    }
	    catch ( IOException e1 ) {
	    	System.out.println( "Client Fehler" );
	    }
	    //catch ( ClassNotFoundException e2 ) {
	    	//System.out.println("Class not Found");
	    //}
	}
	
	
	public static void main(String args[]) {
		new testClient();
	}
}
```


----------



## Brügge (9. Feb 2006)

Das muss natürlich heißen: 

oos.writeInt(test); und nicht oos.writeInt(Spielerzahl);

Ich bin irgendwie aus Versehen auf abschicken gekommen.. -.-

Naja könnte mir jemand sagen warum der server immer nen Fehler bekommt?

Danke!!

Christian


----------



## Guest (9. Feb 2006)

könntest du den fehler etwas genauer beschreiben? wie sieht dieser aus?


----------



## Brügge (9. Feb 2006)

Also der Fehler ist eine IOException im Server, diese wird ja auch aufgefangen und dann ausgegeben ("Server Fehler") im Server (Line 21), geworfen wird der Fehler bei der Zeile test = ois.readInt(); (Line 17 des Servers). Aber ich kann mir nicht erklären wieso 

MFG, Christian


----------



## Gast (9. Feb 2006)

mal als tipp:

poste immer die ersten paar zeilen vom stacktrace mit, damit erleichterst du das fehler raten enorm.

(e.printStackTrace())


----------



## Brügge (9. Feb 2006)

Ich habe e.printStackTrace(); eingefügt und die Exception lautet:

Server Fehler
java.io.EOFException
	at java.io.DataInputStream.readInt(Unknown Source)
	at java.ibjectInputStream$BlockDataInputStream.readInt(Unknown Source)
	at java.ibjectInputStream.readInt(Unknown Source)
	at Server.<init>(Server.java:17)
	at Server.main(Server.java:27)

Aber ich weiß damit leider nix anzufangen... wie kann ich den Fehler beheben?

MFG Christian


----------



## Guest (10. Feb 2006)

Ein Versuch:

Vertausche Zeilen 14 und 15 in der Klasse Server! Das heisst, öffne zuerst den ObjectOutputStream und erst dann den ObjectInputStream!


----------



## Brügge (10. Feb 2006)

Nachdem ich die Zeilen14 und 15 Vertauscht habe, kam ein anderer Fehler, doch wenn ich dann nochmal starte kommt wieder der gleiche Fehler... also irgendwie kommt immer ein anderer Fehler! Ohne das ich etwas verändere... habe ich irgendwie vergessen etwas zu schließen, sodass eine Verbindung vielleicht noch offen ist?

MFG Christian


----------



## igor99 (11. Feb 2006)

Auszug aus der API:


> This constructor writes the serialization stream header to the underlying stream;
> callers may wish to *flush* the stream immediately to ensure that constructors for receiving ObjectInputStreams will not block when reading the header.



nachdem du geschrieben hast (Klasse _testClient_), rufe die methode _flush _auf:

```
oos.writeInt(test);
// methode 'flush' aufrufen
oos.flush();
```

dann sollte es eben gehen!


----------



## Brügge (13. Feb 2006)

Danke für den Tipp, jetzt funktioniert es wunderbar ) 

Danke sehr!!!!!


----------

