# Wichtig für einen Chat?



## Atomic92 (17. Mrz 2008)

Hi
das Thema was ich hier ansprechen will, ist vielleicht etwas umfangreich, aber ich würde es trotzdem gerne ansprechen.
Ich selbst bin ziemlich neu auf dem Gebiet der Netzwerkprogrammierung in Java, habe aber vor mich in Zukunft immer mehr in diese Richtung zu bewegen, da mich das Thema an sich ziemlich reizt.
Deswegen hab ich vor einigen Tagen mit der Programmierung eines Chates angefangen.
Ich kann euch auch hier mal den Quellcode posten, der eigentlich ziemlich kurz ist, was auch der Anlass für meinen Post hier ist.
Wenn ich mir die anderen Chats so angucke, fällt mir immer auf, dass diese mit Threads und allem möglichen arbeiten.
Aber meiner ist halt ziemlich kurz gestrickt und deshalb frage ich, was man alles zu beachten hat.
Ich denke, das dieses Thema auch sehr nützlich für andere User sein kann, da man vielleicht etwas über die Grundlagen zum Programmieren eines Chates lernt.

Hier hab ich mal meinen Quellcode:

Der Launcher um das Programm zu starten


```
package fcmm.server.com;

import java.io.IOException;

public class Launcher 
{
	public static void main(String[] args) throws IOException
	{
		//starte den Server
		KleinerServer server = new KleinerServer();
	}
}
```


Der Server, welcher die Nachrichten abfängt und mit sich die GUI startet.


```
package fcmm.server.com;

import java.net.*;
import java.io.*;


public class KleinerServer 
{
	ServerSocket server = new ServerSocket(1234);
	
	Surface sf = new Surface();
	
	String msg;
	
	InputStreamReader input;
	BufferedReader puffer;
	
	
	public KleinerServer() throws IOException
	{
		//starte die GUI
		sf.show();
		
		//Nachrichten abfangen
		while(true)
		{
			Socket client = server.accept();
			
			input = new InputStreamReader(client.getInputStream());
			puffer = new BufferedReader(input);
			
			
			msg = puffer.readLine();
			sf.updateText(msg);
			
			input.close();
		}
	}
}
```

Der Client, welcher die Nachrichten verschickt.



```
package fcmm.server.com;

import java.net.*;
import java.io.*;

public class Client
{
	PrintWriter output;
	
	public Client() throws IOException
	{
		
		Socket server = new Socket("localhost", 1234);
		
		
		output = new PrintWriter(new OutputStreamWriter(server.getOutputStream()));
		
	}
	
	//Nachrichten versenden
	public void senden(String text)
	{
		output.println(text);
		output.flush();
	}
	
}
```

Die Surface, auf welcher die Eingaben gemacht werden, und angezeigt werden.


```
package fcmm.server.com;

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import javax.swing.*;

public class Surface extends JFrame implements ActionListener //, KeyListener
{
	JTextArea msgIn;
	JTextField msgOut;
	JButton senden;
	JScrollPane scroll;
	
	Client client; 
	
	
		public void actionPerformed(ActionEvent e)
		{
			String label;
			label = e.getActionCommand();
			
			
			if(label.equals("Senden"))
			{
				send();
			}
			
		}
		
		/*
		public void keyTyped(KeyEvent ke)
		{
			int taste = ke.getKeyCode();
			
			if(taste == KeyEvent.VK_ENTER);
			{
				send();
			}
		}
		
		public void keyReleased(KeyEvent ke)
		{
			
		}
		
		public void keyPressed(KeyEvent ke)
		{
			
		}
		*/
		
		public void send()
		{
			try
			{
				client = new Client();
				client.senden(msgOut.getText());
				msgIn.append("\n");
				msgIn.append("Ich: ");
				msgIn.append(msgOut.getText());
				msgOut.setText("");	
			}
			catch
			(IOException io)
			{
			
			}
		}
	
	public Surface()
	{
		setSize(300,380);
		setLocation(300,300);
		setVisible(true);
		setResizable(false);
		
		
		setLayout(new FlowLayout(FlowLayout.CENTER, 20, 20));
		
		setTitle("Chat");
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		msgIn = new JTextArea(null, 10, 20);
		msgIn.setEditable(false);
		msgIn.append("Wilkommen");
		scroll = new JScrollPane(msgIn);
		msgOut = new JTextField(20);
		senden = new JButton("Senden");
		senden.addActionListener(this);
		
		add(scroll);
		add(msgOut);
		add(senden);
		
		//this.addKeyListener(this);
		
		
	public void updateText(String msg)
	{
		StringBuffer text = new StringBuffer();
		text.append("\n");
		text.append("Du: ");
		text.append(msg);
		msgIn.append(text.toString());
		
	}
	
}
```

Ich hoffe, dass dieses Thema euch anspricht und ihr mir helfen könnt.
MFG
Atomic92


----------



## ARadauer (17. Mrz 2008)

hast du eine konkrete frage oder wie können wir dir helfen?


----------



## Atomic92 (17. Mrz 2008)

Hi
also erstmal danke das man sich mit dem Post überhaupt befasst.
Ich selbst würde gerne wissen, in wie fern ich Threads in dem Chat verwenden kann und darf, da ja theoretisch die Verbindung unterbrochen werden müsse.

Außerdem interresiert mich halt, wie ich am besten die Verbindung aufbauen soll:

also welches Protokoll? TCP/IP ? ...

Und was mich auch noch interessieren würde, ob ich meinen Chat verschlüsseln kann.
Also ob ich z.B. die Daten-Pakette mit SSL oder so verschlüsseln kann.
Oder ob ich den Text selbst chefrieren muss.

Ich wäre aber auch für allen anderen Tipps dankbar.

Ich weiß, dass das alles sehr viel verlangt ist, aber ich hoffe, das der ein oder andere mir in einem der Punkte helfen wird.

MFG
Atomic92


----------



## Pappenheimer++ (17. Mrz 2008)

In Punkto Threads: Bei solchen Servern gibt es immer zwei Möglichen keiten: Threads oder Non-Blocking-I/O. Eines von beiden brauchst du in jedem Fall, wenn du mehrere Clients bedienen willst (wovon wir hier mal ausgehen). NIO soll performanter sein, aber den Unterschied wirst du wahrscheinlich erst ab ein paar Hundert Clients merken. Was einfacher zu programmieren ist: keine Ahnung! Mit NIO in Java kenne ich mich überhaupt nicht aus. Ich schreibe aber auch gerade nen Chat und den mach ich mit Threads und TCP. Ich bin zwar auch erst am Anfang, aber das grobe Gerüst steht und funktioniert


----------



## Atomic92 (18. Mrz 2008)

Das was du da oben siehst, also meinen Quellcode, ist auch voll funktionsfähig.
Man muss wohl noch die IP-Adressen im Code ändern, aber das werde ich noch beheben.

Ich hoffe ich bekomme noch auf meine anderen Fragen antwort.

Naja 
MFG
Atomic92


----------

