Java Socket-Kommunikation klappt nicht so ganz...

Tockra

Lt. Commander
Registriert
Dez. 2008
Beiträge
1.063
Hallo Leute,

Ich habe einen Client, welcher mit dem Server kommunizieren soll.
Wenn ein Knopf am Client gedrückt wird, dann soll an den Server der Buttonname übertragen werden.
Dies habe ich wie folgt umgesetzt:
Client:
Code:
        Listener(Socket verbindung)
	{
		try
		{
			out = new PrintWriter(verbindung.getOutputStream());
		}
		catch(IOException e)
		{
		}
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		
			out.println(e.getActionCommand());
	
        }

Server:
Code:
                try
		{
			in = new Scanner(client.getInputStream()); // client ist der Scanner den der Server bekommt
		}
		catch(IOException e)
		{
		}
	        while(true) 
		{
			String input = in.nextLine();
			System.out.println("erreicht");
			...
		}

Leider wird erreicht nicht ausgegeben ...
Ich habe bereich getestet, ob die endlose Whileschleife am Server überhaupt erreicht wird und ob der Client überhaupt eine Verbindung zum Server aufbaut.
Beides trifft zu. Allerdings wird "erreicht" nie erreicht und nextLine gibt nicht die Buttonnamen aus!?

Außerdem habe ich noch das Problem, dass wenn ich den Client schließe, der Server diese Exception bekommt (ich verstehe nicht wieso):
Exception in thread "Thread-19" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)
at AnwendungsThread.run(AnwendungsThread.java:33)
at java.lang.Thread.run(Unknown Source)

Ich hoffe ihr könnt mir helfen!

Gruß
Tim
 
Du schickst nicht den Namen vom Button, sondern den Action Command. Dieser lässt sich dem Button zuweisen und dann in einem Listener abfangen, um so den Button zu identifizieren. Das hat aber nichts mit dem Namen des Buttons zu tun.

Hast du dem Button überhaupt ein ActionCOmmand zugewiesen, ansonsten dürfte der nämlich null sein und dann wird logischerweise auch nischt übertragen.

Ich weiß zwar nicht, inwiefern die Klasse Scanner für Netzwerkkommunikation geeignet ist, aber warum machst du es nicht einfach mit einem normalen Socket und BufferedReader / PrintWriter?

Code:
// CLient
Socket mSocket = null;
int timeout = 3000;

try {
    mSocket = new Socket();
    SocketAddress adr = new InetSocketAddress("127.0.0.1", 12345);
    mSocket.connect(adr, timeout);
    OutputStreamWriter os = new OutputStreamWriter(theSocket.getOutputStream());
    PrintWriter out = new PrintWriter(os, true);

    out.println("Das ist ein Test");
} catch (Exception e) {

} finally {
    mSocket.close();
}

Code:
// Server
Socket mSocket = null;
try {
    ServerSocket mServerSocket = new ServerSocket(12345);

    // BLOCKIERT! Also am Besten alles in einen Thread verfrachten.
    mSocket = mServerSocket.accept();

    BufferedReader in = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));
    OutputStreamWriter os = new OutputStreamWriter(mSocket.getOutputStream());
    PrintWriter out = new PrintWriter(os, true);

    // Blockiert auch
    String s = in.readLine();

    out.println("Habe " + s + " erhalten :)");
} catch (Exception e) {

} finally {
    mSocket.close();
}

Der Code ist jetzt ungetestet, also kann sein dass noch Fehler drin sind. Aber prinzipiell sollte es so gehen. Beim Server auf jeden Fall mit Threads arbeiten!
 
Zuletzt bearbeitet:
möglicherweise ist der action command keine ganze zeile ;)

while(true) geht auch besser: der scanner kann hasNext() ... versuch das mal
 
nextLine() liefert nur dann "true", wenn ein Zeilenende gefunden wird, was bei getActionCommand() nicht der Fall ist...
 
Naja, aber wenn ich out.println(...) verwende, sollte es doch als eine Zeile gelten.
Ähnlich wie System.out.println.

Ich verzweifel hier gerade fast.
Ergänzung ()

Fehler gefunden, beim Erstellen von PrintWriter musste ein true als Argument rein.

Kann mir wer sagen wieso :
PrintWriter out = new PrintWriter(client.getOutputStream())

nicht funktioniert, aber :

PrintWriter out = new PrintWriter(client.getOutputStream(),true)

funktioniert?
 
Mit dem true als 2. Argument aktivierst du autoflush.
Damit wird nach jedem println Aufruf der Puffer geleert und alles gesendet.
 
Zurück
Oben