Ich habe ein Client/Server-Programm, das zwischen Client und Server sowohl mit UDP als auch mit TCP kommunizieren soll. Ein Thread macht die mit UDP Verständigung bezüglich zeitunkritischer Themen wie "lebt der Server noch" und "Uhrzeit-Abgleich". Ein anderer überträgt Daten mit TCP. Soweit die Theorie.
In der Praxis bekomme ich die TCP-Verbindung aber nicht hin. Jetzt habe ich mehrere Tage gesucht. Ich habe aber jetzt keinen Fehler mehr gefunden. Ich bekomme aber immer einen Abbruch beim serversocket.accept();
Das Programm ist viel zu komplex um es hier darstellen zu können. Daher habe ich ein Testprogramm aus dem Web leicht modifiziert, um damit dem Fehler näher zu kommen:
Server-Teil:
Client-Teil:
Starte ich die Programme direkt, dann laufen sie einwandfrei. Starte ich sie aber als eigene Thread saus meinem Programm heraus, dann bricht in diesem Fall der Client mit Fehler ab:
Wesentlicher Unterschied ist aus meiner Sicht eigentlich nur, dass im letzteren Fall eben noch weitere Threads mit Client/Server-Kommunikation laufen.
Hat vielleicht jemand eine Idee, was ich da machen kann?
In der Praxis bekomme ich die TCP-Verbindung aber nicht hin. Jetzt habe ich mehrere Tage gesucht. Ich habe aber jetzt keinen Fehler mehr gefunden. Ich bekomme aber immer einen Abbruch beim serversocket.accept();
Das Programm ist viel zu komplex um es hier darstellen zu können. Daher habe ich ein Testprogramm aus dem Web leicht modifiziert, um damit dem Fehler näher zu kommen:
Server-Teil:
Java:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server implements Runnable{
private static Exception except=null;
public static void main(String[] args) {
Server server = new Server();
try {
server.test();
} catch (Exception e) {
e.printStackTrace();
}
}
void test() throws Exception {
int port = 11111;
ServerSocket serverSocket = new ServerSocket(port);
Socket client = warteAufAnmeldung(serverSocket);
String nachricht = leseNachricht(client);
System.out.println(nachricht);
schreibeNachricht(client, nachricht);
}
Socket warteAufAnmeldung(ServerSocket serverSocket) throws IOException {
Socket socket = serverSocket.accept(); // blockiert, bis sich ein Client angemeldet hat
return socket;
}
String leseNachricht(Socket socket) throws IOException {
BufferedReader bufferedReader =
new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
char[] buffer = new char[200];
int anzahlZeichen = bufferedReader.read(buffer, 0, 200); // blockiert bis Nachricht empfangen
String nachricht = new String(buffer, 0, anzahlZeichen);
return nachricht;
}
void schreibeNachricht(Socket socket, String nachricht) throws IOException {
PrintWriter printWriter =
new PrintWriter(
new OutputStreamWriter(
socket.getOutputStream()));
printWriter.print(nachricht);
printWriter.flush();
}
@Override
public void run() {
Server server = new Server();
try {
Thread.sleep(10000);
server.test();
while (true) Thread.sleep(10000);
} catch (IOException e) {except=e;
} catch (Exception e) {except=e;
} finally {
if (except!=null) {
System.out.println(except.toString());
except.printStackTrace();
except=null;
}
}
}
}
Client-Teil:
Java:
import java.io.*;
import java.net.Socket;
public class Client implements Runnable{
private static Exception except=null;
public static void main(String[] args) {
Client client = new Client();
try {
client.test();
} catch (Exception e) {except=e;
} finally {
if (except!=null) {
System.out.println(except.toString());
except=null;
}
}
}
void test() throws IOException {
String ip = "192.168.178.44"; // localhost
int port = 11111;
Socket socket = new Socket(ip,port); // verbindet sich mit Server
String zuSendendeNachricht = "Hello, world!";
schreibeNachricht(socket, zuSendendeNachricht);
String empfangeneNachricht = leseNachricht(socket);
System.out.println(empfangeneNachricht);
}
void schreibeNachricht(Socket socket, String nachricht) throws IOException {
PrintWriter printWriter =
new PrintWriter(
new OutputStreamWriter(
socket.getOutputStream()));
printWriter.print(nachricht);
printWriter.flush();
}
String leseNachricht(Socket socket) throws IOException {
BufferedReader bufferedReader =
new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
char[] buffer = new char[200];
int anzahlZeichen = bufferedReader.read(buffer, 0, 200); // blockiert bis Nachricht empfangen
String nachricht = new String(buffer, 0, anzahlZeichen);
return nachricht;
}
@Override
public void run() {
Client client = new Client();
try {
Thread.sleep(10000);
client.test();
while (true) Thread.sleep(10000);
} catch (Exception e) {except=e;
} finally {
if (except!=null) {
System.out.println(except.toString());
except.printStackTrace();
except=null;
}
}
}
}
Starte ich die Programme direkt, dann laufen sie einwandfrei. Starte ich sie aber als eigene Thread saus meinem Programm heraus, dann bricht in diesem Fall der Client mit Fehler ab:
Code:
java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at de.virginiacity.software.Client.test(Client.java:24)
at de.virginiacity.software.Client.run(Client.java:53)
at de.virginiacity.software.Juke2010.main(Juke2010.java:197)
Wesentlicher Unterschied ist aus meiner Sicht eigentlich nur, dass im letzteren Fall eben noch weitere Threads mit Client/Server-Kommunikation laufen.
Hat vielleicht jemand eine Idee, was ich da machen kann?