Socket problem

Kakarott

Mitglied
ich sitze schon seit Stunden hier dran und weiß nicht warum er mir nur eine übermittelte Zahl ausgibt, ich habe eine Grafik immer wenn ich wo hinklicke kommt eine int Zahl welche dann an das Action.feldnummer übergeben wird. Diese soll der Client an den Server schicken. Irgendwie schreibt der Server mir aber immer nur die erste zu übermittelnde Zahl auf die Konsole. Glaube er kann sich die Zahlen nicht holen. Da sind sie aber. Sie liegen im Action.feldnummer das hab ich überprüft.
Danke für eure Hilfe.
Code:
package network;

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

import players.Action;

public class Client extends Thread{
	
	public void run(){
		try {
			try {
				coreClient();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}//ende run
	
	public static void coreClient() throws UnknownHostException, IOException, InterruptedException{
		Socket server = null;
		server = new Socket( "localhost", 8888 );
		//InputStream in = server.getInputStream();
		OutputStream out = server.getOutputStream();
		while(true){
			if(Action.feldnummer != 0){
				System.out.println(Action.feldnummer);
				out.write(Action.feldnummer);
				Action.feldnummer = 0;
			}
		}
	}//ende coreClient
}//ende Klasse
Code:
package network;


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;



public class Server extends Thread{
	
	private static InputStream in;
	private static OutputStream out;
	
	public void run(){
		try {
			coreServer();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}//ende run
	
	public static void handlerConnection(Socket client) throws IOException{
		in = client.getInputStream();
		out = client.getOutputStream();
		int result = in.read();
		System.out.println(result);
		in.close();
		out.close();
	}//ende handlerConnection
	
	public static void coreServer() throws IOException{
		ServerSocket server = new ServerSocket( 8888 );
		while(true){
			Socket client = null;
			client = server.accept();
			handlerConnection( client );
		}
	}//ende coreServer
}//ende klasse
 
Hallo,

versuche mal auch den client-Socket zu schleißen

Code:
client.close();

wenn du eh die Streams abbaust, solltest du das auch tun !

Gruß JAdix
 
Hallo,

kannst du mal versuchen innerhalb des while-Blocks ein sleep() einzufügen ?
Nur ein paar Millisekunden. Ist nur so ne Idee. Bringt aber wahrscheinlich nichts !

Code:
	while(true){
		if(Action.feldnummer != 0){
			System.out.println(Action.feldnummer);
			out.write(Action.feldnummer);
			Action.feldnummer = 0;
		}
             sleep(100);
	}

Kannst du noch was zur Action-Klasse sagen ?
Bei feldnummer handelt es sich um ein static-Feld der Klasse
und du sagst das wird korrekt gesetzt ?

Gruß JAdix
 
Seh ich das gerade falsch? Du liest doch in handlerConnection nur einmal vom Client oder? Dann kommt entsprechend auf nur eine Zahl an.
 
Hi @ zeja,

Kakarott baut nach dem Senden jedesmal die Streams (und die komplette Verbindung) ab.
Wartet dann auf ne neue Verbindung und baut die Streams wieder auf !

So sehe ich das aus dem Code ! Finde ich etwas unglücklich gelöst ...

Gruß JAdix
 
Kakarott baut nach dem Senden jedesmal die Streams (und die komplette Verbindung) ab.
Wartet dann auf ne neue Verbindung und baut die Streams wieder auf !

So sehe ich das aus dem Code ! Finde ich etwas unglücklich gelöst ...

Ja hast recht. So implementiert man das eigentlich tatsächlich nicht.

Und nen out.close ist dann auf jeden Fall schädlich. Nen out.flush eher besser.

Noch weniger schön ist aber:
Java:
private static InputStream in;
private static OutputStream out;
im Server. Es kann doch mehrer Clients geben, daher darf man die nicht static machen und noch nicht mal als Feld im Server anlegen. Lokal in der Methode reicht.

Aber der Fehler ist wohl dass in dem Client eine endlosschleife ist die auf den Server schreibt, allerdings der Server nur einmal liest.
 
Zuletzt bearbeitet:
Danke für die Verbesserungsvorschläge des Codes. Da hab ich mich sofort dran gemacht und dabei auch den Fehler bemerkt.
Code:
Socket client = null;
Ich muss diese Zeile aus der Schleife nehmen sonst wartet er jedesmal auf einen neuen Client. Vielleicht kann mir da noch jemand was dazu sagen. Ist doch mein erster Netzwerkversuch. :rolleyes:
Also Funktionieren tut es jetzt aber es ist sicher nicht der beste weg.

War ein falscher Post siehe unten welche Zeile es war.
 
Zuletzt bearbeitet:
Hi

Und nen out.close ist dann auf jeden Fall schädlich. Nen out.flush eher besser.

Naja wenn man den eh nicht verwendeten OutputStream unbedingt schliesen will,
ist das schon OK. Ein close() flusht ja automatisch !

Es ist nur so, dass wenn man eh noch mehr Daten erwartet, man die Verbindung
(insbesondere die, die auf Streams basiert) aufrecht erhält !
Wenn man dann nix mehr zu senden hat, dann baut man ab !

Das mit den static-Feldern hab ich glatt überlesen ohne SyntaxHighlighting !
Ist ja gruselig ! :) (nicht böse sein !)

Gruß JAdix
 
Ich nehme nie etwas böse, sonder immer zu Herzen. Denn alles was ich bis jetzt kann habe ich mir selber bei gebracht und nur aus Büchern und der eigenen Praxis. Daher bin ich immer über alles dankbar was man mir mit auf den weg gibt.
 
Zurück