Ich muß eine Lösung entwerfen und realisieren bei der ein Server Datensätze von hunderten von Clients empfängt und diese dann in eine Datenbank schreibt. Leider komme ich nicht über das Login der Clients hinaus. Ich habe ein recht seltsames Problem:
Ich habe (zum Testen) einen SocketServer und einen Socket-Client geschrieben. Diese sollen abwechselnd miteinander kommunizieren. Wenn ich versuche mich mit dem Testclient einfach mit dem Server zu verbinden und die Übertragung hinzubekommen, stockt der Server schon beim ersten in.readLine(); Wenn ich mich aber per Telnet mit dem Server verbinde und die Strings eintippe funktioniert der Server einwandfrei! Kann mir einer einen Tipp für die Ursache geben?
Laßt euch von den System.out.println(...) nicht stören, ich habe diese zum debugging eingebaut. Und bitte keine Vorschläge, daß ich es mit RMI lösen soll: Die Clients müssen auch in der Lage sein, Daten auf der lokalen Festplatte zwischen zu speichern, fall mal keine Verbindung zum Server besteht.
Ich habe (zum Testen) einen SocketServer und einen Socket-Client geschrieben. Diese sollen abwechselnd miteinander kommunizieren. Wenn ich versuche mich mit dem Testclient einfach mit dem Server zu verbinden und die Übertragung hinzubekommen, stockt der Server schon beim ersten in.readLine(); Wenn ich mich aber per Telnet mit dem Server verbinde und die Strings eintippe funktioniert der Server einwandfrei! Kann mir einer einen Tipp für die Ursache geben?
Code:
public class Server {
public static final int PORT = 8765;
public static void main(String[] args) {
int cnt = 0;
try {
System.out.println("Warte auf Verbindungen auf Port "+PORT+"...");
ServerSocket echod = new ServerSocket(PORT);
while (true) {
Socket socket = echod.accept();
(new ConnectionThread(++cnt, socket)).start();
}
} catch (IOException e) {
System.err.println(e.toString());
System.exit(1);
}
}
}
Code:
public class ConnectionThread extends Thread {
private int name;
private Socket socket;
public ConnectionThread(int name, Socket socket) {
this.setDaemon(true);
this.name = name;
this.socket = socket;
}
@Override
public void run() {
String msg = "Server: Verbindung " + name;
System.out.println(msg + " hergestellt");
try {
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(is));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(os));
System.out.println("Step #1");
String benutzer = in.readLine();
out.write("GOT USERNAME");
out.newLine();
out.flush();
String passwort = in.readLine();
System.out.println("Step #1.2");
out.write("GOT PASSWORD");
out.newLine();
out.flush();
System.out.println("Step #2");
System.out.println("Benutzername: " + benutzer);
System.out.println("Passwort: " + passwort);
System.out.println("Step #3");
if ((benutzer.equalsIgnoreCase("test")) && (passwort.equalsIgnoreCase("123"))) {
out.write("OK");
out.newLine();
out.flush();
System.out.println("Step #3.1");
} else {
out.write("IGNORE");
out.newLine();
out.flush();
System.out.println("Step #3.2");
}
System.out.println("Step #4");
System.out.println("Verbindung " + name + " wird beendet");
in.close();
out.close();
} catch (IOException e) {
System.err.println(e.toString());
} finally {
try {
socket.close();
} catch (IOException ex) {
System.err.println(ex.toString());
}
}
}
}
Code:
public class Client {
public static void main(String[] args) {
Socket server = null;
try {
System.out.println("Open socket...");
server = new Socket("172.20.50.89", 8765);
System.out.println("Initilize streams...");
InputStream is = server.getInputStream();
OutputStream os = server.getOutputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(is));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(os));
System.out.print("Write username... ");
out.write("test");
out.flush();
System.out.println("written");
System.out.println("Waiting for answer... --> "+in.readLine());
System.out.print("Write password...");
out.write("123");
out.flush();
System.out.println("written");
System.out.println("Waiting for answer... --> "+in.readLine());
String antwort = in.readLine();
System.out.println("Answer server: "+in.readLine());
if (antwort.equalsIgnoreCase("OK")) {
System.out.println("Write dataset...");
out.write("Schicke Datensatz!");
out.flush();
}
System.out.println("Write close...");
out.write("Beende Verbindung!");
in.close();
out.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (server != null) {
try {
System.out.println("Close connection...");
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Laßt euch von den System.out.println(...) nicht stören, ich habe diese zum debugging eingebaut. Und bitte keine Vorschläge, daß ich es mit RMI lösen soll: Die Clients müssen auch in der Lage sein, Daten auf der lokalen Festplatte zwischen zu speichern, fall mal keine Verbindung zum Server besteht.