Java Socket-Kommunikation

Hallo,

ein Problem macht sich breit, welches mich am Weiterkommen hintert - wie das halt so ist.

Ich bin dabei eine Kommunikation aus drei Schichten zu entwerfen. Die erste Schicht ist die Serverschicht. Sie baut einen SocketServer auf Port 11111 auf:

Code:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

public class SocketServer extends Thread {

	public static void main(String[] args) {

		new SocketServer().start();
	}

	public static boolean flag = false;

	synchronized public void run() {

		flag = true;
		ServerSocket server = null;
		
		try {

			server = new ServerSocket(11111);
		} catch (Exception e) {

			System.out.println("Error: Cannot start SocketServer");
		}
		
		System.out.println("Server startet at " + new Date());

		while (true) {

			String input = null;
			StringBuilder sb = new StringBuilder(255);

			try {

				Socket client = server.accept();

				InputStream is = client.getInputStream();
				InputStreamReader isr = new InputStreamReader(is); 
				BufferedReader in = new BufferedReader(isr); 

				OutputStream os = client.getOutputStream();
				OutputStreamWriter osw = new OutputStreamWriter(os); 
				BufferedWriter out = new BufferedWriter(osw); 

				try {

					while ((input = in.readLine()) != null) {

						if (input.length() > 0) {
						
							sb.append(input);
						}
					}

					input = sb.toString();

					if (input.length() > 0) {
					
						System.out.println("Got message: " + input);
					}
					
					out.write(input + "\0");
					out.flush();				
					
					out.close();
					in.close();
					client.close();
				} catch (Exception e) {

					System.out.println("Error while getting message from client: " + e.getMessage());
				}
			} catch (Exception e) {

				System.out.println("Error while building socket connection with client: " + e.getMessage());
			}
		}
	}
}

Die zweite Schicht besteht aus einem Sender, welcher sich zum Server connectet und mittels OutputStream Daten sendet:

Code:
import java.net.*;
import java.io.*;

public class Sender {

	public static void main(String[] args) {

		sendErrorMessage("Hallo Welt");
	}
	
	public static void sendErrorMessage(String message) {
		
		try {
			
			Socket socket = new Socket("192.168.3.51", 11111);
			
			OutputStream os = socket.getOutputStream();
			OutputStreamWriter osw = new OutputStreamWriter(os); 
			BufferedWriter out = new BufferedWriter(osw);
			
			out.write("-error " + message);
			out.flush();
			out.close();
			socket.close();			
		} catch (Exception e) {
			
			System.out.println("Error while sending socket message: " + e.getMessage());
		}
	}
}

Die dritte Schicht besteht aus einem Empfänger. Auch er baut eine Verbindung zum Server auf, greift aber lediglich Daten mittels InputStream ab und gibt diese aus:

Code:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class ErrorHandling {

	public static void main(String[] args) {
		
		System.out.println(">>>" + receivingErrors());
	}
	
	public static String receivingErrors() {
		
		InputStream is;
		InputStreamReader isr;
		BufferedReader in;
		String input = "";
		StringBuilder sb;
		
		try {
			
			Socket socket = new Socket("192.168.3.51", 11111);
			
			is = socket.getInputStream();
			isr = new InputStreamReader(is); 
			in = new BufferedReader(isr);
			
			input = null;
			sb = new StringBuilder(255);
			
			while ((input = in.readLine()) != null) {

				sb.append(input);
			}

			input = sb.toString();
			
			in.close();
			socket.close();
		} catch (Exception e) {
			
			System.out.println(e.getMessage());
		}
		
		return input;
	}
}

Hoffe das Ganze ist verständlich, falls nicht bitte einfach nachfragen.

Die Problematik liegt nun im Empfänger. Starte ich den Server und sende aus der Sender-Klasse ein paar Strings, gibt der Server diese auch fein säuberlich aus. Darin sehe ich keine Probleme. Schalte ich aber den Empfänger (Klasse ErrorHandling) dazwischen, und würde dort gerne Daten abfangen, die der Server ausspuckt (und vom Sender bekommt) so passiert garnichts.

Weder der Server gibt eine Ausgabe aus, noch der Empfänger.

Terminiere ich allerdings den Empfänger, so kommen alle Meldungen, die der Sender veschickt hat, am Server an und er gibt diese aus. Aber erst, wenn der Empfänger beendet ist.

Kurz gesagt, der Empfänger blockiert irgendwie die Kommunikation im ganzen Komplex.

Ich weiß nun nicht mehr weiter, darum bitte ich um Hilfe.



Mfg Tom
 
Hallo,

das Problem ist, dass dein Server keinen Unterschied zwischen Sender und Empfänger macht. Wenn du den Empfänger zum Server verbindest, erwartet dieser Daten von dem Empfänger, weil er denkt, dass das der Sender ist.
Du müsstest im Server, nachdem du das Socket angenommen hast, z.B. einen Integer lesen, der angibt ob es sich um Sender oder Empfänger handelt und dann auch nur bei dem einen lesen und bei dem anderen schreiben, statt beides bei beiden. Die Integer müssen natürlich auch vorher von Sender/Empfänger gesendet werden.
 
Hallo,

genau das war mein Problem.

Ich danke Dir!

Zur Lösung: Sender und Empfänger senden im vorraus einen byte an den Server. Der Server fragt das byte ab und setzt einen Flag, wie er fortfahren soll. Beim Empfänger darf nur gesendet werden, da wird kein InputStream mehr gelesen (ausser das erste byte zur Erkennung). Wenn die Abrage nicht geschieht, versucht der Server einen InputStream zu lesen, den er beim Empfänger nicht bekommt. Er hängt sich also in eine Warteschleife, die kein Ende hat.

Der Sender bekommt einen Input- und einen OutputStream. Er empfängt Daten, speichert diese in eine Variable, und sendet diese wieder in die freie Welt hinaus.

Das wars eigentlich schon.




Mfg Tom
 
Theoretisch könntest Du auch im Server prüfen, ob was gesendet wird, wenn nicht, dann muß es der Empfänger sein.
 
Zurück