Problem mit Server-Client-Kommunikation

Xeonkryptos

Bekanntes Mitglied
Moin Leute,

ich hab das Problem, dass ich momentan an einem Server und den dazugehörigen Client arbeite und das Programm steckt halt noch in den Kinderschuhen. :)
Nun ist mein Problem, ich gebe einen normalen, einfachen Text in eine JTextArea ein und habe natürlich ein Button, mit dem ich über ein ActionEvent die Daten an meinen Server senden möchte.
Java:
@Override
		public void actionPerformed(ActionEvent e) {
			if (e.getActionCommand().equals("btnSend")) {
				messageWriter.println(taMessageField.getText());
				taMessageProcess.append("\n" + messageWriter.checkError());
			}
		}
Nun habe ich natürlich getestet, wann der Server die Nachricht erhält und wie man sehen kann, ob es eine Fehlermeldung gibt. Die Nachricht erscheint komischerweise den Server erst nach dem 3. Buttondruck, während ich es aber schon 3x versendet habe, kommt es nur 1x (!) an. Ich habe es schon geschafft, dass es nach dem 2. Drücken des Buttons am Server ankommt, es soll aber schon nach dem einmaligen Drücken beim Server ankommen und ich weiß nicht, wieso ich erst mehrmals drücken muss???

Zur Info: meine Variable "messageWriter" ist als PrintWriter deklariert, autoFlush() ist im Konstruktor auf "true" gesetzt und er erhält den OutputStream von dem Server, sofern eine Verbindung zu diesem hergestellt werden konnte.

Hoffe ihr könnt mir bei meinem Prob helfen.
 
S

SlaterB

Gast
rufe doch einfach testweise flush() auf, wenn dir das schon als ein interessanter Punkt auffällt,
ansonsten wäre für mich kompletter Quellcode interessant, in einem Programm von einer main aus
Server starten + Client aufmachen der entweder sparsamerweise mit paar sleeps Verzögerung sendet oder notfalls mit einfacher GUI und deinen Button,

Programm starten testen fertig mit Fehler oder nicht,
mit etwas Pech kann natürlich bei anderen alles laufen, nur bei dir der Fehler auftreten..
 

Xeonkryptos

Bekanntes Mitglied
Code Client:

Java:
import client.ChatClient;
import client.GUI.thread.ClientGUIThread;

public class ClientGUI extends JFrame {

	private ChatClient client;
	private BufferedReader messageReader;
	private PrintWriter messageWriter;

	private ClientGUIThread readerThread;

	public ClientGUI() throws IOException, AWTException {
		super("Vampire - The Dark Ages-Chat");

		// GUI gedöns

		chatClient();
	}

	private void chatClient() {
		client = new ChatClient("localhost", 3141);
		try {
			messageReader = new BufferedReader(new InputStreamReader(
					client.getInputStream()));
			messageWriter = new PrintWriter(client.getOutputStream(), true);
		} catch (final IOException e) {
			// ... Reaktion ist unrelevant, da nur Information durch Anzeige
		initReaderThread(messageReader, taMessageProcess);
	}

	private void initReaderThread(BufferedReader messageReader,
			JTextArea taMessageProcess) {
		readerThread = new ClientGUIThread(messageReader, taMessageProcess);
		readerThread.start();
	}

	class Listener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			if (e.getActionCommand().equals("btnSend")) {
					messageWriter.println(taMessageField.getText());
					taMessageProcess.append("\n" + messageWriter.checkError());
			}
		}
	}
}

Code Server:

Java:
public class ChatServer {

	private ServerSocket serverSocket;
	private BufferedImage img;

	public ChatServer(int port) throws IOException, AWTException {
		setServerPort(port);
		waitForConnection();
	}

	private void setServerPort(final int port) {
		try {
			serverSocket = new ServerSocket(port);
		} catch (final IOException e) {
			// ...
		}
	}

	private void waitForConnection() {
		while (true) {
			Socket client = null;

			try {
				client = serverSocket.accept();
			} catch (IOException e) {
				e.printStackTrace();
			}
			ClientConn thread = new ClientConn(client);
			thread.start();
		}
	}
	
	public InetAddress getServerIP() {
		return serverSocket.getInetAddress();
	}
}

Testweise hab ich schon flush() aufgerufen, es hat leider nur nichts gebracht...

Die restlichen Klassen in meinem Code oben: ClientConn ist nur eine Klasse, die von Thread erbt und in der run()-Methode einfach nur eine Endlosschleife ausführt, die dann halt aus dem BufferedReader alles ausliest und es über den PrintWriter wieder an den Client schickt... Thread für den Server.

ClientGUIThread arbeitet mit dem selben Prinzip, wie es die ClientConn für den Server tut, nur dass dieser einfach nur die Infos ausliest und die Infos dann auf meinem JTextArea taMessageProcess anzeigt.

Die main-Methoden hab ich halt auf andere Klassen ausgelagert, aber die sind ja schnell geschrieben :)
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Bevor man sich dem "GUI Schnickschnack" widmet, sollte man sich erst mal auf's wesentliche Beschränken: Der Kommunikation zwischen Server und Client.
Ich habe dann Code gesehen und plötzlich keine Lust mehr diesen zu lesen und nach relevantem Inhalt zu suchen ;-)

Ich verstehe, dass man sich eher dem zuwendet was man kann und wo man sofort Erfolgserlebnisse hatte, aber das ganze drum herum erschwert Dir und allen anderen die Fehlersuche.
 

Xeonkryptos

Bekanntes Mitglied
Hab meinen Beitrag mal editiert und auf den wirklich relevanten Code reduziert.

Michael... hat gesagt.:
Bevor man sich dem "GUI Schnickschnack" widmet, sollte man sich erst mal auf's wesentliche Beschränken

Ich hab damit angefangen, da ich einfach im Grunde diesen SendButton und das Textfeld haben wollte, um mir die Arbeit über die Konsole sparen zu können. Daraufhin hab ich halt einfach den groben Rest gemacht und dann mit der Kommunikation begonnen, aber wie man es macht ist im Endeffekt egal, nur dass man an sein Ziel kommt und der Code so gut wie möglich abstrakt ist :)

Ist aber auch egal. Code ist reduziert und alles Frame-unrelevante rausgenommen, sodass das lesen jetzt leichter fallen sollte =)
 

Xeonkryptos

Bekanntes Mitglied
und den relevanten Thread, der den InputStream des Clients ausliest vergessen ;-)

Den hab ich eigentlich oben erklärt, aber nun gut, dann noch ein bisschen mehr =)

ServerThread (Auslesen und weiterleiten):
Java:
public class ClientConn extends Thread {

	private Socket client;
	private static BufferedReader serverRead = null;
	private static PrintWriter serverWrite = null;

	public ClientConn(Socket client) {
		this.client = client;
	}

	@Override
	public void run() {

		try {
			serverRead = new BufferedReader(new InputStreamReader(
					client.getInputStream()));
			serverWrite = new PrintWriter(client.getOutputStream(), true);
		} catch (final IOException e) {
			// ...
		}

		try {
			while (true) {
				if (serverRead.readLine() != null) {
					System.out.println(serverRead.readLine());
					serverWrite.println(serverRead.readLine());
				}
			}
		} catch (final IOException e) {
			//...
		}
	}
}

Zur Info, bevor Kritik kommt, ich hab serverRead und serverWrite static gemacht, damit ich diese in einer statischen Disconnect-Methode verwenden kann!

Und der ClientThread (ausschließlich einlesen und ausgeben)
Java:
public class ClientGUIThread extends Thread {

	private BufferedReader messageReader;
	private JTextArea taMessageProcess;

	public ClientGUIThread(BufferedReader messageReader,
			JTextArea taMessageProcess) {
		this.messageReader = messageReader;
		this.taMessageProcess = taMessageProcess;
	}

	@Override
	public void run() {
		while (true) {
			try {
				if (messageReader != null) {
					taMessageProcess.append(messageReader.readLine() + "\n");
// einfach nur für den Verlauf wichtig
				}
			} catch (IOException e) {
				// ...
			}
		}
	}
}
 
S

SlaterB

Gast
ChatClient fehlt noch, den GUI-Code wegzukürzen so dass man das Programm dann gar nicht mehr ausführen kann ist auch nicht gerade ein Ziel in meinen Augen, wenn dann durch einfacheren Konsolen-Ablauf ersetzen,

immer ein vollständiges lauffähiges Programm inklusive main-Methode posten, dann gibts weniger zu diskutieren,
möglichst kurz natürlich

---------


aber die fehlenden Klassen haben ja nun doch Hinweise gebracht:
Java:
if (serverRead.readLine() != null)
                {
                    System.out.println(serverRead.readLine());
                    serverWrite.println(serverRead.readLine());
                }
3 readLine()-Aufrufe verlangen 3 Eingaben, oder?
 

Michael...

Top Contributor
Den hab ich eigentlich oben erklärt, aber nun gut,
Und genau da steckt schon mal ein Fehler:
Java:
				if (serverRead.readLine() != null) {
					System.out.println(serverRead.readLine());
					serverWrite.println(serverRead.readLine());
Hier wird drei mal in Folge readLine() auf den Input aufgerufen, mit der Folge:
- jede erste gelesene Zeile wird verworfen
- jede zweite wird auf System.out ausgegeben
- jede dritte Zeile wird über den Output zurückgeschrieben.
Zur Info, bevor Kritik kommt, ich hab serverRead und serverWrite static gemacht, damit ich diese in einer statischen Disconnect-Methode verwenden kann!
Keine Kritik, nur ein Hinweis: Wenn daraus ein Chat werden soll muss das static weg.
 

Xeonkryptos

Bekanntes Mitglied
Keine Kritik, nur ein Hinweis: Wenn daraus ein Chat werden soll muss das static weg.

Hab es geändert und es funktioniert einwandfrei. Das static habe ich auch rausgenommen, dennoch bleibt mir jetzt die Frage, wieso muss bei einem möglichen Chat das static raus? Mir ist bis jetzt keine Einschränkung daran aufgefallen? Du hast einen Grund und ich würde ihn gern hören trotz erledigtem Thema. =)
 
S

SlaterB

Gast
offensichtlich weil der Server mehrere ClientConn gleichzeitig hat mit jeweils eigenen serverRead usw.,
unabhängig davon wie schlecht das benannt ist und ob man das generell umbauen sollte

static ist nur einmal da, mehrere werden gebraucht -> nicht static, Objekte eben
 

Xeonkryptos

Bekanntes Mitglied
unabhängig davon wie schlecht das benannt ist und ob man das generell umbauen sollte

Mir lässt das jetzt irgendwie keine Ruhe mehr. :) Ich habe es mal anderst umbenannt, wodurch es klarer werden sollte, wofür die Variablen jetzt genau stehen, aber ich würde gerne wissen, wie du das generell umgebaut hättest? Ich habe den Ansatz aus einem CodeBeispiel von einem programmierten einfachen Chat herausgeholt (Kein Copy-Paste!) und darauf halt aufgebaut.

Mir geht es nicht um vorgefertigten Code, sondern um das Prinzip, da ich ja selber das Lernen will. Ich bin jetzt kein Java-Anfänger, aber auch kein Java-Profi... irgendetwas dazwischen halt und bin für Ratschläge und Verbesserungsvorschläge offen :)

Gruß
Xeonkryptos
 
S

SlaterB

Gast
ich habe keinen bestimmten Änderungsvorschlag, wenn du so fragst ist das für mich ok umgesetzt,
ich wollte das nur nicht als gegeben bestätigen, nur static weg und final
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Server-Client IO Problem Netzwerkprogrammierung 6
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
B Client/Server Connection Problem Netzwerkprogrammierung 2
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
K Client - Server Problem Netzwerkprogrammierung 16
T RMI Problem Client-Server Netzwerkprogrammierung 2
J Socket Client - Server Problem Netzwerkprogrammierung 4
D Client Server Problem, Methode readline() löst SocketException "Connection reset" aus Netzwerkprogrammierung 8
J Client server problem Netzwerkprogrammierung 3
S Problem bzgl. Sockets / Server-Client-Struktur Netzwerkprogrammierung 3
N Socket Java server c# client problem Netzwerkprogrammierung 7
K Problem Performance Client-Server Netzwerkprogrammierung 5
W Problem mit Server/Client mit ObjectOutputStream Netzwerkprogrammierung 5
S Client-Server Chat Problem nur im lokalen Netztwerk Netzwerkprogrammierung 23
K Client-Server Problem Netzwerkprogrammierung 2
G Problem mit Client-Server Kommunikation Netzwerkprogrammierung 4
S Client/Server Problem Netzwerkprogrammierung 2
A Client Server Problem Netzwerkprogrammierung 37
G Problem bei Objekt senden von server zu client Netzwerkprogrammierung 6
L ganz ganz einfach Client/Server [Problem] Netzwerkprogrammierung 2
R Java Applikation als Client ,Servlet als Server: Problem? Netzwerkprogrammierung 3
V Client Server Problem, empängt oder sendet nichts Netzwerkprogrammierung 4
M HttpUrlConnection + Client/Server Problem Netzwerkprogrammierung 2
S Problem mit der Client Server Netzwerkprogrammierung 6
S Habe ein Problem mit Sockets -> Client Server Netzwerkprogrammierung 2
G Datenautausch Client/Server , hab da ein kleines problem Netzwerkprogrammierung 3
L Socket Problem mit Server Netzwerkprogrammierung 1
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
Shams Problem mit Eventbus in Verbindung mit Server Netzwerkprogrammierung 0
T Socket Server starten Thread Problem Netzwerkprogrammierung 12
D Apache CXF, JAX-WS Problem bei Arrays - einfacher Server Netzwerkprogrammierung 2
M Problem mit Server Netzwerkprogrammierung 5
W vista / win server 2003 netzlaufwerk problem Netzwerkprogrammierung 4
M Server Problem Netzwerkprogrammierung 3
S RMI-Problem: Nur ein Server start möglich. Netzwerkprogrammierung 40
U problem mit verbindung zu einem irc server Netzwerkprogrammierung 3
G Problem bei Server verbindung : ( Netzwerkprogrammierung 8
J Kleines Problem mit Chat Server Netzwerkprogrammierung 2
S problem mit server Netzwerkprogrammierung 2
S RMI Server Basic Problem Netzwerkprogrammierung 13
I Socket Problem mit den WebSocket Antworten der Discord API Netzwerkprogrammierung 0
K Java Websocketserver Problem | Android to Pi Netzwerkprogrammierung 1
C RMI Produzent-Verbraucher-Problem - Code review Netzwerkprogrammierung 12
B Socket Bilder verschicken via Sockets. Heap-Problem. Netzwerkprogrammierung 2
S Problem bei dem Bluetoothverbindungsaufbau Netzwerkprogrammierung 2
M Netty - TCP Problem Netzwerkprogrammierung 4
M Problem bei Socket (MultiplayerSpiel) Netzwerkprogrammierung 4
M Socket CDI, Websocket reference Problem ! Netzwerkprogrammierung 2
G apache httpClient Problem. Netzwerkprogrammierung 5
H Problem mit ObjectStreams Netzwerkprogrammierung 3
D Socket BufferedWriter/Reader Problem Netzwerkprogrammierung 1
Maxim6394 Problem mit Socks5 Implementierung Netzwerkprogrammierung 0
C Handle Connection Problem Netzwerkprogrammierung 3
E HttpUrlConnection Cookie Problem Netzwerkprogrammierung 0
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
O 4Gewinnt Multiplayer - Netzwerk Problem (TCP) Netzwerkprogrammierung 1
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
R Problem beim Programmieren eines Chatprogramms Netzwerkprogrammierung 5
E einfaches Problem: Session-Handling bei Servlets Netzwerkprogrammierung 5
G Problem mit einem FileWatcher Netzwerkprogrammierung 7
G Problem mit STATIC-Verständnis Netzwerkprogrammierung 8
S Umstellung AS400 auf Postgre - Problem beim Arbeiten mit Metadaten Netzwerkprogrammierung 2
J Facelets Include Rendered Problem Netzwerkprogrammierung 2
J Socket Problem mit C++/Java Netzwerkprogrammierung 20
P Problem mit Datagram-Sockets Netzwerkprogrammierung 2
G Socket NIO2 Problem mit AsynchronousSocketChannel beim Schließen Netzwerkprogrammierung 3
G Cookie Verwaltungs Problem nach Login auf InetSeite (Wo utma-Cookie?) Netzwerkprogrammierung 18
C Socket Problem mit ObjectInput/OutputSream Netzwerkprogrammierung 7
B Socket Problem mit Netzwerkchat Netzwerkprogrammierung 21
D RMI Problem beim shutdown von verteilter CORBA-Anwendung Netzwerkprogrammierung 6
Maxim6394 ipv6 Problem Netzwerkprogrammierung 2
Maxim6394 Proxyserver Performance Problem Netzwerkprogrammierung 11
C Socket Problem mit ObjectInput/OutputSream Netzwerkprogrammierung 5
B RMI und Problem mit rmic-Tool Netzwerkprogrammierung 3
C FTP storeFileStream Problem Netzwerkprogrammierung 3
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
D JavaMail - Mailsabrufen Problem (imap) Netzwerkprogrammierung 12
J HTTP Übersetzung yahoo babelfish - Zeichensatz-Problem Netzwerkprogrammierung 6
M Problem beim Datenempfang Netzwerkprogrammierung 2
M Problem mit Socket-Verbindung Netzwerkprogrammierung 2
N NIO Problem beim speziellen Behandeln von einzelnen Benutzern Netzwerkprogrammierung 13
D Thread problem Netzwerkprogrammierung 3
T Servlets JSP: Tomcat Problem Netzwerkprogrammierung 4
P RMI Stub Problem Netzwerkprogrammierung 3
D Socket UDP Übertragungs Problem Netzwerkprogrammierung 7
I HTTP Post aus html in Java einlesen - Problem Netzwerkprogrammierung 2
I HTTP Post aus html in Java einlesen - Problem Netzwerkprogrammierung 6
D Problem mit ObjectInputStreams Netzwerkprogrammierung 10
D Socket Problem mit InputStreamReader Netzwerkprogrammierung 3
N CRC32 CheckSum Problem bei UDP Netzwerkprogrammierung 2
V Java Mail Api - IMAP Problem Netzwerkprogrammierung 6
P RMI Problem Netzwerkprogrammierung 4
I Problem bei Outputstreamerzeugung in anderer Klasse als Socket Netzwerkprogrammierung 5
S Socket Problem mit Objektübertragung Netzwerkprogrammierung 16
Shoox Reader / Writer Problem Netzwerkprogrammierung 2
S Problem mit 2 Serversockets unter Win XP Netzwerkprogrammierung 7
P Socket Problem mit Netzwerkverbindung über TCP Netzwerkprogrammierung 12
M RMI - Connection Problem Netzwerkprogrammierung 7
M Socket Chat-Client-Problem Netzwerkprogrammierung 8
E HTTP Problem beim Auslesen von Websiten Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben