# Java-Chatprogramm via Console



## SurPlex (6. Jun 2012)

Hey Leute. Ich habe eine Frage und zwar;
Wir sollen in der Schule eine Chatprogramm schreiben. Wo der Server mehrere Clients annimmt, so wie das bei einem Chat üblich ist. 
Meine Idee war es, alles via Console zu machen, da ich nicht, wie alle anderen eine oberfläche haben wollte. 
Das momentane Problem ist nur, dass ich, wenn mehrere Clients joinen, dass dann jeder natürlich nur seine eigene Console hat, aber nicht das von den anderen sieht (also das geschriebene); kann man irgendwie die consolen zusammen legen? ; beziehungsweise das jewails geschriebene an einen anderen client schicken? 
Ich zeige euch hier mal meinen Quellcode. Vielleicht oder sicherlich habt ihr so einige Verbesserungsvorschläge. (Bitte nicht lachen, ist eins meiner ersten, richtigen, eigenen Schulprojekte.) Bin aber bereit zu lernen!  


Hier seht ihr zuerst die Server Klasse:


```
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.imageio.IIOException;

public class Server extends Thread {

	public static void main(String args[]) throws IOException {
	
		while (true) {
			try {

				int txt = 0;
				String nickname = null;
				
				ConnectionHandler ch = new ConnectionHandler();
				ServerSocket server = new ServerSocket(3162);
				Socket client = server.accept();
				InputStream in = client.getInputStream();
				OutputStream out = client.getOutputStream();
				
			} catch (IOException e) {
				// System.out.println("Fehler beim Connecten!");
			}
	}
```

Und hier die des Clients. 

```
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.sql.Array;
import java.util.ArrayList;

import javax.imageio.IIOException;
import javax.swing.JOptionPane;

public class Client {
	public static void main(String args[]) throws IOException, IOException {
		
		
		ArrayList<String> list = new ArrayList<String>();
		
		ConnectionHandler ch = new ConnectionHandler();
		Socket server = new Socket("localhost", 3162); // Server Verbinden
		InputStream in = server.getInputStream();
		OutputStream out = server.getOutputStream();
		
		// Nickname wird abgefragt
		String a = JOptionPane.showInputDialog("Nickname eingeben");
		String nickname = a;
		
		namenswahl(list,a);
		
		System.out.println(nickname + " ist beigetreten.");
		schreiben(nickname);
		System.out.println(nickname + " hat den Chat verlassen.");
	}

	// Methoden.
	public static void schreiben(String nickname) throws IOException {
		ConnectionHandler ch = new ConnectionHandler();
		String text = "";
		byte[] b = new byte[1024];
		System.in.read(b);
		for (int i = 0; i < b.length; i++) {
			if (b[i] == '*')
				return;
			text = text + (char) b[i] + "";
		}
		sendString(nickname,null);
		sendString(text, null);
				System.out.println(nickname + " schreibt: " + text);
		schreiben(nickname);

	}
	 public static void namenswahl(ArrayList list , String a)throws IOException{
		 for (int i = 0; i < list.size(); i++) {
				if (a != list.get(i)) {
					list.add(a);

				} else {
					System.out
							.println("Ein User mit diesem Nickname ist bereits online!");
					namenswahl(list, a);

				}
			}
	 }
	 public static void sendString(String send, OutputStream out) throws IOException {
			byte[] senden = send.getBytes();
			out.write(senden);

}
}
```

Ich wäre euch dankbar, wenn man mir dabei helfen könnte. (Ich weiß, es sind noch weitaus mehr Fehler drin, die man verändern könnte. - Aber gut wäre es, erst einmal das eine hinzubekommen. ~ danach kann ich mich noch den anderen Sachen widmen. 

PS: Jeder hat mal klein Angefangen! 


Vielen dank für die Hilfe.


----------



## SurPlex (6. Jun 2012)

Da ich meinen Beitrag nicht editieren kann (hab ausversehn, die Aktivierungslink-email gelöscht); nochmal ein paar Zusatzinformationen. 

Ich dachte mir, dass ich es vielleicht so setze, dass ich die Daten(also den text) irgendwie an den Server schicke & dann wieder zurück an den Clienten, womit dann eigentlich alle, auf ihrer Console ihren, sowie den Text von anderen sehen sollten. - Würde sowas in der Art funktionieren?


----------



## Camill (6. Jun 2012)

In deinem Code kommt mehrmals [c]ConnectionHandler ch = new ConnectionHandler();[/c] vor, was passiert in der Klasse?

Tutorials/Beispiele zu diesem Thema gibt es zu Hauf.
Einiges was mir beim schnellen überschauen deines Code bereits aufgefallen ist:

der Server lässt zwar Verbindungen zu, jedoch werden diese nicht "weiterverarbeitet"
client: woher kennt dieser die Namen der anderen Clients?
client: darf nur einmal geschrieben werden?
...


----------



## SurPlex (6. Jun 2012)

Die Klasse ConnectionHandler sieht wie folgt aus:
[Java] import java.io.IOException;
import java.io.InputStream;
import java.iutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.sql.Array;
import java.util.ArrayList;

import javax.imageio.IIOException;
import javax.swing.JOptionPane;

public class Client {
	public static void main(String args[]) throws IOException, IOException {


		ArrayList<String> list = new ArrayList<String>();

		ConnectionHandler ch = new ConnectionHandler();
		Socket server = new Socket("localhost", 3162); // Server Verbinden
		InputStream in = server.getInputStream();
		OutputStream out = server.getOutputStream();

		// Nickname wird abgefragt
		String a = JOptionPane.showInputDialog("Nickname eingeben");
		String nickname = a;

		namenswahl(list,a);

		System.out.println(nickname + " ist beigetreten.");
		schreiben(nickname);
		System.out.println(nickname + " hat den Chat verlassen.");
	}

	// Methoden.
	public static void schreiben(String nickname) throws IOException {
		ConnectionHandler ch = new ConnectionHandler();
		String text = "";
		byte[] b = new byte[1024];
		System.in.read(b);
		for (int i = 0; i < b.length; i++) {
			if (b_ == '*')
				return;
			text = text + (char) b + "";
		}
		sendString(nickname,null);
		sendString(text, null);
				System.out.println(nickname + " schreibt: " + text);
		schreiben(nickname);

	}
	 public static void namenswahl(ArrayList list , String a)throws IOException{
		 for (int i = 0; i < list.size(); i++) {
				if (a != list.get(i)) {
					list.add(a);

				} else {
					System.out
							.println("Ein User mit diesem Nickname ist bereits online!");
					namenswahl(list, a);

				}
			}
	 }
	 public static void sendString(String send, OutputStream out) throws IOException {
			byte[] senden = send.getBytes();
			out.write(senden);

}
}[/code]

Sie war einfach eine Grundlage zum Senden und empfangen von Strings, wir hatten das als kleine Hilfestellung beziehungsweise kleines "Mitbringsel" an die Hand gegeben bekommen.

Ja, ich habe bereits auch so einige Beispiele gefunden, jedoch arbeiten diese auch alle mit einem GUI oder anderen Dingen, aber das wollte ich ja eben nicht tun. Sondern mich erst einmal nur auf die Console beziehen.

Okay, an die Fragestellungen, muss ich mich dann wohl noch einmal dransetzen. Ist mir bisher noch nicht aufgefallen. Aber danke schon einmal für die, auch sehr schnelle, Hilfestellung._


----------



## SurPlex (6. Jun 2012)

Mist! Das war leider die falsche.
Ich weiß nicht, was heute mit mir los ist. :! Wohl nicht mein Tag. 
Natürlich ist der ConnectionHandler das hier:


```
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class ConnectionHandler {

	public void sendString(String send, OutputStream out) throws IOException {
		byte[] senden = send.getBytes();
		out.write(senden);
	}

	public String receive(InputStream in) throws IOException {
		byte[] puffer = new byte[1024];
		int anz = in.read(puffer);
		String txt = new String(puffer, 0, anz);
		return txt;
	}
}
```


----------

