KartoffelKiffer
Mitglied
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:
Die zweite Schicht besteht aus einem Sender, welcher sich zum Server connectet und mittels OutputStream Daten sendet:
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:
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
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