![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| Neuer Benutzer Registriert seit: 14.12.2005
Beiträge: 11
|
Verbindung etc klappt alles. Nur gibt es ein kleines Problem: Der Server wartet immer wieder auf Benutzereingaben (Console!) und holt dann als nächstes eine Nachricht vom Clienten (Der Client wartet hingegen auf einkommende Nachrichten (Socket) und schickt diese dann zum Server zurück. Wie kann ich das ganze nun so umbauen dass ich auch mit dem Clienten Nachrichten schreiben kann, ähnlich so wie der Server über die Console und soviele Nachrichten wie man will, sodass darauf also ein richtiger Chat wird? Beide sollen also schreiben und lesen können zur gleichen Zeit! Server Code: import java.net.*;
import java.io.*;
public class KnockKnockServer {
public static void main(String[] args) throws IOException {
/* ServerSocket
* Socket
* BufferedReader
* PrintWriter
* BufferedReader (System.in)
*/
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(4444);
System.out.println("Listening on port: 4444 now.");
} catch (IOException e) {
System.err.println("Could not listen on port: 4444.");
System.exit(1);
}
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
System.out.println("Connected request accepted.");
} catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
BufferedReader consoleIn = new BufferedReader(new InputStreamReader(System.in));
/* Communicate with the client
*
*/
String cIn;
while((cIn = consoleIn.readLine()) != null) {
out.println(cIn);
System.out.println("Server -> Client: " + cIn);
System.out.println("Server <- Client " + in.readLine());
}
/* Closing BufferedReader and PrintWriter
* Closing all sockets
*/
System.out.println("Closing...");
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
}
Code: import java.io.*;
import java.net.*;
public class KnockKnockClient {
public static void main(String[] args) throws IOException {
/* Socket
* BufferedReader
* PrintWriter
* BufferedReader (System.in)
*/
Socket kkSocket = null;
PrintWriter out = null;
BufferedReader in = null;
try {
kkSocket = new Socket("googler", 4444);
out = new PrintWriter(kkSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
System.out.println("Connected to server");
} catch (UnknownHostException e) {
System.err.println("Don't know about host.");
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection.");
System.exit(1);
}
BufferedReader consoleIn = new BufferedReader(new InputStreamReader(System.in));
/* Communicate with the server
*
*/
String fromServer;
while((fromServer = in.readLine()) != null) {
System.out.println(fromServer);
out.println("That was your message to me: " + fromServer);
}
/* Closing BufferedReader and PrintWriter
* Closing Socket
*/
System.out.println("Closing...");
out.close();
in.close();
kkSocket.close();
}
}
__________________ |
| | |
| | Nach oben #2 |
| Benutzer Registriert seit: 11.06.2005
Beiträge: 36
|
Hallo, mal bischen was prinzipielles... da sich nur 1 Client zu einem Zeitpunkt mit dem Server verbinden kann, muss der Server die Nachrichten für den anderen Client speichern. Der Client müßte also 2 Befehle ausführen können. Einer wäre das Senden von Nachrichten. Dabei wird die Nachricht in den Speicher der Nachrichten für den (die) anderen Client(s) gespeichert. Und das Empfangen von Nachrichten. Dafür wird eben der Speicher ausgelesen und geleert. Diese 2 Befehle können (fürs senden) kombiniert werden. Zur Clientidentifikation gibts sicherlich verschiedene Möglichkeiten. Ip-Adressse ist wohl dafür nicht geeignet. Auf jeden Fall muss eine eindeutige Kennung für jeden Client verwendet werden. für Probleme beim Codieren...immer rein damit mfG |
| | |
| | Nach oben #3 |
| Neuer Benutzer Registriert seit: 14.12.2005
Beiträge: 11
|
aber _wie_? Ich habe vor einiger Zeit mit Visual Basic augehört und mich quält es immernoch In VB konnte ich einfach in die Event Sektion "DataArrival" vom Socket reinschreiben was zu tun ist und z.B. wenn einer nen Button anklickt in eben diesen Buttonclick event hineinschreiben was zu tun ist. Ich will hier ersteinmal keine GUI verwenden und durch diese VB Zeug komm ich nicht weiter... wie kann ich das denn realisieren? Das andere ist erstmal nebensächlich für mich (das nur 1 Client connecten kann, Identifizierung etc.)
__________________ |
| | |
| | Nach oben #4 |
| Benutzer Registriert seit: 11.06.2005
Beiträge: 36
|
Also in wie weit das nebensächlich ist, ist die Frage. Das merkst du dann allerspätestens bei der Programmierung. Eine GUI steht hier völlig außer Frage, weil das eig. nichts mit dem eig. Problem zu tun hat und programmtechnisch völlig was anderes ist. Ich schätze ohne Erfahrung mit Java und den Konzepten der Netzwerk- Programmierung siehts schlecht aus für einen Chat, außer jemand programmiert das für dich und dann copy&paste. Aber hat das Sinn? Also meine Tipps: Beschäftige dich mit Java, mit Netzwerkprogrammierung und dann leg los... |
| | |
| | Nach oben #5 | |
| Sesselkleber Registriert seit: 17.01.2005
Beiträge: 575
| Zitat:
Natürlich kann sich mehr als ein Client mit einem ServerSocket verbinden, und das auch noch gleichzeitig. Der Server verwendet den ServerSocket ja nach einem erfolgreichen Verbindungseingang als Socket weiter, und demnach kann er ebenso wie der Client damit Daten empfangen und versenden. Dazu muss der der Server den neuen Socket nur in einem eigenen Thread behandeln, und schon funktioniert es. Gruß Sparrow | |
| | |
| | Nach oben #6 |
| Neuer Benutzer Registriert seit: 14.12.2005
Beiträge: 11
|
Ich habe doch gar nicht nach einer fertigen Lösung oder fertigen Quellcode gefragt... Dein "Tipp", wirklich sehr lustig... was meinst du was ich mache :rolleyes: Hast du dir überhaupt meine beiden Posts richtig durchgelesen, dann wüsstest du ja wie genau mein Problem aussieht. Verbindung steht, Nachrichten können übertragen werden, Problem steht oben.
__________________ |
| | |
| | Nach oben #7 | |
| Benutzer Registriert seit: 11.06.2005
Beiträge: 36
|
Hallo, Zitat:
Ich will jetzt nicht dein Code zitieren relax aber so gehts auf jeden Fall nicht. Wenn das durch die Threads so schön funktioniert, dann würd ich folgendes machen. Clients verbinden sich, Server speichert die Verbindungen in eigene Threads. Client sendet..Server verteilt die Nachricht auf die Socket der anderen Clients. Und dann klappt das... mfG | |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Problem E-Mails zu senden | Jann Hendrik | Plauderecke | 7 | 25.05.2007 21:37 |
| Logisches Problem beim einsatz von Ereignissen | Prophet | Allgemeine Java-Programmierung | 19 | 05.06.2006 22:08 |
| Klassenhirarchie - Problem | Chr!s | PHP-Programmierung | 13 | 22.04.2006 14:23 |
| Problem mit Cookie und Reloads... | Bookworm | PHP-Programmierung | 10 | 13.04.2006 12:09 |
| OSX + Eclipse 3.1 Problem | bacarni | Eclipse | 3 | 29.07.2005 21:19 |