Portal > Foren > Java > Allgemeine Java-Programmierung > Chat *Logik?* Problem
Antwort
 
Themen-Optionen
Alt 14.12.2005, 22:57 Nach oben    #1
Neuer Benutzer
 
Registriert seit: 14.12.2005
Beiträge: 11
Standard Chat *Logik?* Problem

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();
	}
}
Client
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();
	}
}
__________________
^^
relax ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.12.2005, 23:37 Nach oben    #2
Benutzer
 
Registriert seit: 11.06.2005
Beiträge: 36
Standard

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
rath ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2005, 00:00 Nach oben    #3
Neuer Benutzer
 
Registriert seit: 14.12.2005
Beiträge: 11
Standard

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.)
__________________
^^
relax ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2005, 00:18 Nach oben    #4
Benutzer
 
Registriert seit: 11.06.2005
Beiträge: 36
Standard

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...
rath ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2005, 00:57 Nach oben    #5
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 575
Standard

Zitat:
Zitat von rath
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
Ähm.. das stimmt so nicht.
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
sparrow ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2005, 01:08 Nach oben    #6
Neuer Benutzer
 
Registriert seit: 14.12.2005
Beiträge: 11
Standard

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.
__________________
^^
relax ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2005, 06:54 Nach oben    #7
Benutzer
 
Registriert seit: 11.06.2005
Beiträge: 36
Standard

Hallo,

Zitat:
Dazu muss der der Server den neuen Socket nur in einem eigenen Thread behandeln, und schon funktioniert es.
Na wenn das so ist dann müssen die Nachrichten wohl nicht zwingend gespeichert werden und können direkt versendet werden.

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
rath ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2005, 07:47 Nach oben    #8
Neuer Benutzer
 
Registriert seit: 14.12.2005
Beiträge: 11
Standard

Und wie funktioniert das genau mit den Threads? bitte nicht auf die Api verlinken :rolleyes:
__________________
^^
relax ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2005, 08:25 Nach oben    #9
Benutzer
 
Registriert seit: 11.06.2005
Beiträge: 36
Standard

ein "Erklärungslink"

http://www.galileocomputing.de/openb....htm#Xxx999378
rath ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ä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


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:45 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44