Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hallo,

ich soll ein Chat Programm programmieren, aus den beiden Programmen Client und Server, die ich schon programmiert habe. Die soll ich zu einem Chat Programm verbinden. Kann mir jemand helfen? Wie muss ich das machen? Wie sieht dann der Quellcode aus? Vielen Dank.

Java:

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.Socket;

import java.util.Scanner;

public class Client implements Runnable {

private String host = "192.168.178.9";

public Client(String host) {

if (host != null) {

this.host = host;

}

}

@Override

public void run() {

Socket s = null;

BufferedReader in = null;

BufferedWriter out = null;

try {

s = new Socket(host, 8888);

in = new BufferedReader(new InputStreamReader(s.getInputStream()));

out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

Scanner console = new Scanner(System.in);

while (true) {

out.write(console.nextLine() + "\n");

out.flush();

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (out != null) {

try {

out.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (in != null) {

try {

in.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (s != null) {

try {

s.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

public static void main(String[] args) {

if (args.length == 0) {

new Thread(new Client(null)).start();

} else {

new Thread(new Client(args[0])).start();

}

}

}

------------------------------------------------

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.ServerSocket;

import java.net.Socket;

public class Server implements Runnable {

@Override

public void run() {

ServerSocket ss = null;

Socket s = null;

BufferedReader in = null;

BufferedWriter out = null;

try {

ss = new ServerSocket(8888);

s = ss.accept();

in = new BufferedReader(new InputStreamReader(s.getInputStream()));

out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

while (true) {

System.out.println(in.readLine());

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (out != null) {

try {

out.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (in != null) {

try {

in.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (s != null) {

try {

s.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (ss != null) {

try {

ss.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

public static void main(String[] args) {

new Thread(new Server()).start();

}

}

Die Frage, die sich mir stellt, ist: warum? Der Trick an einem Chat mit Client und Server ist ja, dass der Server irgendwo zentral läuft, und n Clients an anderer Stelle betrieben werden.

Wenn es trotzdem gefordert ist, dann nimm den Inhalt der beiden main-Methoden, schreib ihn in eine eigene main-Methode einer neuen Klasse und fertig. Dann werden ein Server- und ein Clientprozess gestartet und betrieben.

[EDIT]Ach ja, verwende für Quellcodeausschnitte bitte beim nächsten Mal die entsprechenden CODE-Tags, dann ist das besser lesbar. [/EDIT]

Peter

Die Frage, die sich mir stellt, ist: warum? Der Trick an einem Chat mit Client und Server ist ja, dass der Server irgendwo zentral läuft, und n Clients an anderer Stelle betrieben werden.

Wenn ich im Bereich P2P oder Multicast das ansiedel, dann kann es auch dezentral sein. Deine Meinung würde ich da nur begrenzt unterstützen

Phil

@KoB:

Dann muss man sich aber wieder brav drum kümmern, dass die Ensprechenden Ports freigegeben werden etc...

@Threadstarter:

Mach doch einfach in die ChatGUI nen Button: "Start Server".

Wenn der Benutzer da drauf drückt, startest du den Server und verbindest den eigenen Client automatisch zu localhost.

Mit dem P2P Einwand habt Ihr natürlich recht, daran habe ich nicht gedacht. Den Einwand / Hinweis von Speedi an mich verstehe ich nicht. Wenn es darum geht, dass beide Klassen die 8888 als Port verwenden - natürlich muss man hier unterschiedliche Ports angeben, das sehe ich als Selbstverständlichkeit an.

@OP Erzähl mal, was Du wirklich machen sollst, sonst müssen wir hier rumspekulieren. Also nicht "ich soll die beiden in ein Programm zusammenbauen", sondern was soll hier mit diesem Programm passieren?.

Peter

Bei P2P ist der Client auch gleichzeitig der Server.

Bei einem Chat brauchst du entweder einen zentralen Server, zu dem sich alle Clienten verbinden, so wie beim Messenger ICQ, oder du gehst gleich zu P2P.

Dann ist dein Client auch ein Server.

Beispiel für ein P2P-Chat gibts zum Beispiel hier.

Battleship-Chat.png

Netzwerkprogrammierung in Java - Page 4

In unserem letzten Client-Server-Projekt hat ein Arbeitskollege ebenfalls ein Chatprogramm geschrieben.

Soviel wie ich mitbekommen habe, kann ich dir folgende Tipps geben:

Lese dich mal in RMI ein... das ist einfacher als ne plumpe Socket-Verbindung

Die Insel hilft dir da ganz gut

Thema RMI bei java ist auch eine Insel

Ein Abstecher zum Design-Pattern Observer kann auch nicht schaden.

Observer(Beobachter)

Ansonsten wie gesagt, ne genaue Beschreibung was ihr machen sollt wäre schon cool.

Gruß, Marcel

Lese dich mal in RMI ein... das ist einfacher als ne plumpe Socket-Verbindung

Ich glaube das Thema RMI hatten wir zu Beginn des Threads. Aber ich muss dem doch schon beipflichten, dass RMI wirklich einfach ist :-P

Ansonsten wie gesagt, ne genaue Beschreibung was ihr machen sollt wäre schon cool.

Full ack

Phil

Ich habs an anderen Stellen schon gelesen. Bitte schiesst nicht mit Äpfeln auf Birnen. RMI ist zum Verteilen von Anwendungen (in mehreren Schichten) da. Nicht unbedingt das i-Tüpfelchen um Client-Server-lose Chats zu entwickeln.

RMI hat einen Nachteil in diesem Bezug. RMI nutzt eine echte Client-Server-Struktur und bekommt Angaben zu veröffentlichten Methoden/Objekten über die RMI-Registry, die natürlich allen C+S bekannt sein muss.

D.h. wenn ich eigentlich noch garkeine anderen Chatpartner kenne und keinen Masterserver habe, ist das mittels RMI nicht lösbar. Ergo daraus wird niemals ein echter Server-loser Startzustand.

Das erreicht man nur mit unschönen UDP-Broadcasts im lokalen Netz oder besser mit Multicast. Multicast-Programmierung ist allerdings keine alltägliche Netzwerkprogrammierung, aber auch kein Hexenwerk. Wir hatten an anderer Stelle hier bereits Threads dazu mit OpenSource-Projekten, die Multicast Chats implementierten.

Oder aber ich bin völlig falsch und seit meinen letzten Projekten mit RMI und CORBA hat sich da technisch viel verändert.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.