Variablen an Server senden

  • Themenstarter Themenstarter Bruegge
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
B

Bruegge

Gast
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:
Code:
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:
Code:
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
 
jetzt mal aus der huefte geschossen:

mach deine objecte serializable und wrappe ein ojectstream um deinem socket.
 
Hättest du vielleicht einen kleinen BeispielCode, da ich mich erhlich gesagt erst seit kurzem mit Netzwerkprgrammierung befasst habe ^^

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

Christian
 
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:
Code:
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:
Code:
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();
	}
}
 
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
 
könntest du den fehler etwas genauer beschreiben? wie sieht dieser aus?
 
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
 
mal als tipp:

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

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

Server Fehler
java.io.EOFException
at java.io.DataInputStream.readInt(Unknown Source)
at java.i😵bjectInputStream$BlockDataInputStream.readInt(Unknown Source)
at java.i😵bjectInputStream.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
 
Ein Versuch:

Vertausche Zeilen 14 und 15 in der Klasse Server! Das heisst, öffne zuerst den ObjectOutputStream und erst dann den ObjectInputStream!
 
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
 
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:
Code:
oos.writeInt(test);
// methode 'flush' aufrufen
oos.flush();

dann sollte es eben gehen!
 
Danke für den Tipp, jetzt funktioniert es wunderbar 🙂)

Danke sehr!!!!!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben