# Chatprogramm - Server funktioniert nicht



## k.west (1. Jan 2013)

Hi,
ich hab versucht einen einfachen Chat nur zwischen zwei Computern (im Heimnetzwerk) zu programmieren. Deshalb habe ich dem "Serverteil" des Programms mithilfe Runnable einen Thread zugewiesen (soll ja immer empfangen).
Wenn ich das Programm auf beiden Computern starte, funktioniert zunächst auch alles super (Verbindung kann aufgebaut werden usw.), wenn ich aber was in den Chat schreibe, wird es nur beim "Absender" angezeigt.


```
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

	
public class MaxChat extends JFrame implements Runnable
{
	JTextArea chat;
	JTextField eingabe;
	Thread empfang;
	Socket s;
	ServerSocket server;
	
	MaxChat(String titel)
	{
		super(titel);
		chat=new JTextArea(500, 100);
		chat.setEditable(false);
		eingabe=new JTextField(200);
		Box box=Box.createVerticalBox();
		box.add(chat);
		box.add(eingabe);
		add(box);
		
		try
		{
			server=new ServerSocket(1234);
			empfang=new Thread(this);
			empfang.start();
			s=new Socket(InetAddress.getByName("Joachim").getHostAddress(), 1234);
		}
		catch(Exception e)
		{
			System.err.println(e);
		}
		
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		
		eingabe.addKeyListener(new KeyLauscher());
	}
	
	class KeyLauscher extends KeyAdapter
	{
		public void keyPressed(KeyEvent e)
		{
			if(e.getKeyCode()==KeyEvent.VK_ENTER)
			{
				if(eingabe.getText()!=null)
				{
					try
					{
						s=new Socket(InetAddress.getByName("Joachim").getHostAddress(), 1234);
						PrintWriter ausgabe=new PrintWriter(s.getOutputStream());
						ausgabe.write(eingabe.getText()+"\n");
						ausgabe.flush();
						ausgabe.close();
						chat.append("\nGonzo: "+eingabe.getText());
						eingabe.setText("");
					}
					catch(Exception i)
					{
						System.err.println(i);
					}
				}
			}
		}
	}
					
	public void run()
	{
		try
		{
			Socket accept=server.accept();
			InputStream input=accept.getInputStream();
			BufferedReader r=new BufferedReader(new InputStreamReader(input));
		
			while(true)
			{
				String eingabe=r.readLine();
				if(eingabe!=null)
				{
					chat.append("\nJoachim: "+eingabe);
				}
			}
		}
		catch(Exception e)
		{
			System.err.println(e);
		}
	}
	
	public static void main(String[] args)
	{
		MaxChat fenster=new MaxChat("MaxChat");
		fenster.pack();
		fenster.setVisible(true);
	}
}
```

Habs auch schon mit zwei parallelen Threads für "Server-" und "Clientteil" meines Programms versucht, ist aber genau dasselbe rausgekommen. 

Bin auf dem Gebiet noch ziemlicher Anfänger, kann also sein, dass das hier totaler Müll ist.


----------



## k.west (1. Jan 2013)

Ach ja, noch zum besseren Verständnis: "Joachim" und "Gonzo" sind die Namen meiner beiden Computer.


----------



## trääät (1. Jan 2013)

1) Server und Client sollte grundsätzlich zwei völlig getrennte programme sein ...
einen server in eine app einzubauen hat nur bei bestimmten aufgaben sinn

2) verwende direkt IP-adressen anstatt die windows-namens-auflösung ... die kann auch daneben gehen ... server sollten eh immer feste IPs haben

3) nutze bitte google und die sufu ... denn es gibt gut tutorials zum thema netzwerkprogrammierung und chats ...


----------



## k.west (1. Jan 2013)

Okay, dann versuch ichs vielleicht mal mit einer Trennung von Server und Client. Kannst du mir vielleicht erklären, wieso das nötig ist?
Die IP-Adressen hab ich jetzt mal nur zum Test mit der Windows-Namenauflösung verwendet, weil ich keinen Server habe und ich es noch nicht geschafft habe, meine Computer-IP ohne Probleme auf statisch umzustellen.


----------



## tröööt (2. Jan 2013)

na das geht ja gut los ... aber jeder anfang ist schwer ...

server und client sollten in der regel getrennt sein weil sie völlig andere aufgaben haben ...

die server-anwendung z.b. läuft in der regel als system-dienst im hintergrund und sollte so stabil programmiert sein das es auch bei fehlern zu keinem schweren absturz führt

der client dagegen hat in der regel nur die aufgabe eingaben vom user zum server zu senden und dessen antworten darzustellen ...
schmiert der client aus irgendeinem grund ab ist eigentlich egal wie man drauf reagiert ... aber man darf dabei den server nicht mitreißen ... das ist schon einer der hauptgründe für die trennung

ein anderer grund ist natürlich das der server in der regel auf einem zentral im netz erreichbaren rechner läuft ... einem rechner ohne graphische oberfläche ... hier könnte man also eine GUI-software gar nicht nutzen ...


das mit "server sollten feste IPs haben" hast du etwas missverstanden ... ich meinte damit keinen "server" im netz ... sondern lediglich die server-software und den rechner auf dem diese läuft ...
auch in einem LAN sollte für solche dinge fest IPs eingestellt werden ...

in der regel geht das recht easy ...
man schaut in den aktuellen status der verbindung und trägt diese einfach bei static ein ...
wenn zusätzlich ein DHCP läuft ist zu empfehlen außerhalb dessen range zu arbeiten ... also wenn der DHCP z.b. zwischen 192.168.0.100 und 192.168.0.200 arbeitet am besten irgendwas unter 100 oder über 200 wählen ... so läuft man nicht gefahr eine IP zu nutzen die der DHCP an eine andere maschine vergeben hat ...

natürlich muss man drauf achten wo sich der rechner "bewegt" ...
wenn man mit nem laptop viel unterwegs ist und sich in verschiedene hotspots einklinkt muss man natürlich jedes mal die automatik wieder einschalten oder andere vorgaben nutzen ...
steht der große schwere tower aber wirklich nur zu hause ist das ja völlig egal ...

wichtig ist natürlich das man auch ein LAN nutzt ... also richtung internet mindestens einen router zwischen hat ...



Spoiler: OT



[ot]mir ist es leider von mehreren anbietern bekannt das diese ihre gerät nur als modem konfigurieren obwohl diese router-eigenschaften nutzen und sich 2 oder mehr user GLEICHZEITIG über EIN dsl-konto einwählen können ...
nur weil dann physisch beide maschinen in einem LAN wären (wenn das gerät richtig eingestellt wäre) sind diese es aber logisch noch lange nicht ...
dies betrifft leider nicht nur einen doch sehr populären anbieter sondern ist eigentlich bei allen möglich die entsprechende geräte an ihre kunden ausliefern die falsch konfiguriert sind ...

sollte man also ein gerät haben was eben KEIN LAN bildet sondern nur ein modem ist hilft nur der kauf eines handelsüblichen routers ... diese sind dann in der regel recht gut vorkonfiguriert ... kostenpunkt im notfall ca 20€ ...[/ot]



ansonsten ist netzwerkprogrammierung mit java recht einfach ... alles notwendige kommt mit ... man muss halt nur etwas allgemeinwissen über netzwerke haben


----------



## k.west (4. Jan 2013)

Danke, super Antworten und das Chatprogramm läuft jetzt auch! 
Danke für die Hilfe!


----------

