Server-Client Problem

VBKenner

Mitglied
Guten Tag!
Ich hab hier ein Problem, das bringt mich um den Verstand!
http://xidev.xi.funpic.de/java/

dort clientservervbkenner.zip

downloaden.

Es sind 2 Projekte, beide in Eclipse programmiert.


Ich beschreibe am besten kurz was gemacht wird, damit ihr mir schneller helfen könnt^^

Der Server erstellt 3 Objekte:
NetSocket (stellt den Socket bereit und BufferedReader sowie den PrintReader)
ConsoleDataArrival (extends Thread und wartet auf Userinput über die Console!)
NetDataArrival (extends Thread und wartet auf einkommende Nachrichten über den Socket!)

Das gleiche macht auch der Client (nur halt leicht verändert)

Beide scheinen Verbunden zu sein (gibt ja auch keine Exceptions) Man kann auch was schreiben und beide Threads laufen...
Nur Nachrichten kommen irgendwie nicht an, entweder es liegt am Verschicken an einer Stelle oder am Empfangen. Und es gibt keine Errors!

Um das Problem einzugrenzen gabe ich einen kleinen Clienten geschrieben der einfach nur zum Server connected und eine Nachricht abschickt, nur hier tritt eine SocketException auf...
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder$CharsetSD.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at NetDataArrival.run(NetDataArrival.java:16)

Und das wiegesagt nur wenn man den vereinfachten Clienten benutzt.

edit: Falls ihr aus irgendeinem Grund euch die Zip nicht runterladen wollt:
server: http://relaxserver.pastebin.com/483972
client: http://relaxclient.pastebin.com/483973
 
Zuletzt bearbeitet:
Hast du vllt. eine Firewall laufen? Wenn ja guck mal nach, dass die javaw.exe und die java.exe nicht geblockt werden.. (Hat mein McAffee auch schon gemacht :rolleyes: )
 
läuft auf ein und demselben rechner... geht mit dem offiziellen Sun tutorial ja...

edit: läuft keine softwarefirewall
 
Zuletzt bearbeitet:
Hallo!

Du musst schon von einem Thread aus den Anfang machen und Daten senden... es reicht nicht nur die write Methode aufzurufen. Da musst du auch mal flushen ... oder einen PrintStream verwenden und println aufrufen.

Schau mal hier:
Unser Server:
Code:
 package de.tutorials.socketexample.server;
 
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
 import java.io.PrintStream;
 import java.net.ServerSocket;
 import java.net.Socket;
 
 public class Server {
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) throws Exception {
 		System.out.println("Server Ready!");
 		ServerSocket serverSocket = new ServerSocket(3333);
 		Socket socket = serverSocket.accept();
 		System.out.println("Connected: " + socket.getRemoteSocketAddress());
 
 		BufferedReader br = new BufferedReader(new InputStreamReader(socket
 				.getInputStream()));
 		PrintStream ps = new PrintStream(socket.getOutputStream());
 
 		ps.println("Server: " + System.currentTimeMillis());
 
 		String line;
 		while ((line = br.readLine()) != null && line.indexOf("EXIT") < 0) {
 			System.out.println("Received: " + line);
 			ps.println("Server: Thank you for: " + line);
 		}
 
 		br.close();
 		ps.close();
 		socket.close();
 	}
 
 }

Unser Client:
Code:
 /**
  * 
  */
 package de.tutorials.socketexample.client;
 
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
 import java.io.PrintStream;
 import java.net.Socket;
 
 /**
  * @author Tom
  * 
  */
 public class Client {
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) throws Exception {
 		Socket socket = new Socket("localhost", 3333);
 
 		BufferedReader br = new BufferedReader(new InputStreamReader(socket
 				.getInputStream()));
 		PrintStream ps = new PrintStream(socket.getOutputStream());
 
 		BufferedReader systemIn = new BufferedReader(new InputStreamReader(
 				System.in));
 
 		String line;
 
 		while ((line = br.readLine()) != null) {
 			System.out.println("Received: " + line);
 			String message = systemIn.readLine();
 			ps.println("Client: " + message);
 		}
 
 		br.close();
 		systemIn.close();
 		ps.close();
 		socket.close();
 	}
 }

Gruß Tom
 
Hi Tom!
Ja, ich hab's nun hinbekommen, es fehlte das flushen aber ich kapier irgendwie nicht warum das nen flush() hin muss! Beim offiziellen Java socket tutorial ham die auch nicht flush benutzt und es geht trotzdem.

Ich hätte da noch eine Frage:
Code:
 		try {
 			while((tempConsoleIn = consoleIn.readLine()) != null ) {
 			    netSocket.netOut.println(tempConsoleIn);
 				netSocket.netOut.flush();
 			    System.out.println("Sending: " + tempConsoleIn);
 			}
 		
 			
 		/*	while(true) {
 			    if ( (tempConsoleIn = consoleIn.readLine()) != null ) {
 				    netSocket.netOut.println(tempConsoleIn);
 				    netSocket.netOut.flush();
 				    System.out.println("Sending: " + tempConsoleIn);
 				}
 			}*/
 		} catch (IOException e) {
 			System.out.println("Ein Consoleneinlesefehler ist aufgetreten!");
 		}


die beiden schleifen machen im Enfeffekt das gleiche ja?
 
Nö machen sie nicht, die erste hört auf, wenn keine Daten mehr vorhanden sind, die zweite läuft unendlich lang weiter.
Wenn die indentisch sein sollen muss da noch nen else-Teil hin:
Code:
else
{
  break;
}
 
Zurück