YujiSakaii Geschrieben 21. Januar 2011 Teilen Geschrieben 21. Januar 2011 Schönen Gutan Tag allerseits ich hoffe ihr könnt mir helfen (bin in java noch relativ neu) ich habe im zuge meiner ausbildung die aufgabe bekommen einen einfachen java chat zu programmieren, in der form das ich einen server habe und mehrere clients die immer alle die nachricht erhalten egal von wen geschrieben nun habe ich mittlerweile einen funktionsfähigen server und client (ich habe es so eingerichtet das auch der server nachrichten schreiben kann) nun komme ich leider nicht weiter da ich keine idee habe wie ich es regeln könnte das alle die nachricht erhalten und nicht nur einer. das ist mein server import java.io.*; import java.net.*; import java.util.*; public class ServerTest { public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(4444); System.out.println("Server gestartet"); } catch (IOException e) { System.err.println("Das ist nicht möglich!"); System.exit(-1); } Socket clientSocket = null; for(int i=1;;i++) { try { clientSocket = serverSocket.accept(); System.out.println("Client eingetroffen"); } catch (IOException e) { System.err.println("Accept failed: 4444"); System.exit(-1); } SocketHandler sh = new SocketHandler(clientSocket, i); sh.start(); clientSocket = null; } } } class SocketHandler extends Thread { private Socket socket; private int ID; public SocketHandler(Socket clientSocket, int i) { socket = clientSocket; ID = i; } public void run() { try{ PrintWriter ausgabe = new PrintWriter(socket.getOutputStream(), true); BufferedReader eingabe = new BufferedReader(new InputStreamReader(socket.getInputStream())); ausgabe.println("Der Server hat dich als Nummer"+ID+" verbunden"); System.out.println("Der Server hat sich mit Nummer"+ID+" verbunden"); String inputLine; while ((inputLine = eingabe.readLine()) != null) { System.out.println("User" +ID + inputLine); if (inputLine.equals("Bye")) { break; } Scanner scan = new Scanner (System.in); String antwort = scan.nextLine(); ausgabe.println("Server: "+antwort); } ausgabe.println("Der Server trennt die Verbindung mit dir"); System.out.println("Der Server trennt die Verbingung mit Nummer"+ID); ausgabe.close(); eingabe.close(); socket.close(); } catch (Exception e) { } } } und das ist mein client import java.io.*; import java.net.*; public class ClientTest { public static void main(String[] args) throws IOException { Socket socket = null; try { socket = new Socket("10.4.34.231", 4444); } catch (IOException e) { System.err.println("Accept failed: 4444"); System.exit(-1); } PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in)); String inputLine, eingabeLine; if ((inputLine = in.readLine()) != null) System.out.println(inputLine); while ((eingabeLine = eingabe.readLine()) != null) { if (eingabeLine.equals("Bye")) break; out.println(eingabeLine); inputLine = in.readLine(); System.out.println(inputLine); } out.close(); in.close(); socket.close(); } } und noch etwas ich möchte keinesfalls ein fertiges programm sondern nur einen schubs in die richtige richtung bzw einen ansatz wie ich das lösen kann denn ich bin grade wirklich planlos Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 21. Januar 2011 Teilen Geschrieben 21. Januar 2011 [...]nun komme ich leider nicht weiter da ich keine idee habe wie ich es regeln könnte das alle die nachricht erhalten und nicht nur einer. Mit was kommst Du nicht weiter ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
YujiSakaii Geschrieben 21. Januar 2011 Autor Teilen Geschrieben 21. Januar 2011 ich möchte den server sagen das er nachrichten allen schicken soll und nicht nur einen ein bsp.: wenn ich im server eine nachricht eine tippe kommt die nur bei einen an wenn dann noch eine eingegeben wird bei einen anderen usw und ich möchte nun wissen ob es eine möglichkeit gibt zu sagen schicke immer allen die nachricht Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 21. Januar 2011 Teilen Geschrieben 21. Januar 2011 Der Server Prozess muss für jeden Client einen Socket haben. Bei einer eingehenden Nachricht am Server muss dann die Nachricht auf alle Sockets geschrieben werden. Ich verweise mal auf http://forum.fachinformatiker.de/java/144506-server-client-chat.html dort geht es um das gleiche Thema Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
speedi Geschrieben 26. Januar 2011 Teilen Geschrieben 26. Januar 2011 Du musst - wie flashpix schon sagste - schauen, dass die Nachricht vom Server im den OutputStream eines jeden Sockets geschrieben wird. D.h. du musst dir deine einfach zentral eine Liste anlegen in der du sämtliche Sockets - oder gleich die ganzen ClientHandler reinschmeißt. Wenn dann eine Nachricht über den Server geht gehst du die Sockets in der Liste durch und schickst die Nachricht an jeden. TCP-Sockets kannst du als Punkt- zu Punkt- Verbindung von einem Ort zum anderen betrachten. Wenn du über einen Socket sendest empfängt das auch genau einer. Wenn es alle bekommen sollen musst du über jeden Socket auch was senden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
YujiSakaii Geschrieben 31. Januar 2011 Autor Teilen Geschrieben 31. Januar 2011 okay, wäre mein problem dann mit einen multicast gelöst? d.h. wenn der server eine eingabe bekommt sendet er das dann automatisch an alle oder muss ich explizit sagen schicke die eingabe an den den und den ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 31. Januar 2011 Teilen Geschrieben 31. Januar 2011 okay, wäre mein problem dann mit einen multicast gelöst? Du hättest selbst einmal recherchieren können, was Multicast ist: Multicast ? Wikipedia Multicast macht den Server dann überflüssig Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
YujiSakaii Geschrieben 31. Januar 2011 Autor Teilen Geschrieben 31. Januar 2011 ist es dann nicht eher der broadcast ich möchte schließlich das jeder sämtliche eingaben erhält und nicht nur bestimmte, soll heißen ein client macht eine eingabe und alle anderen user erhalten die gleiche, Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 31. Januar 2011 Teilen Geschrieben 31. Januar 2011 ist es dann nicht eher der broadcast Schau Dir bitte an, was ein Broadcast ? Wikipedia ist Multicast != Broadcast, die Antwort ergibt sich dann aus der Definition des Multicast Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
YujiSakaii Geschrieben 31. Januar 2011 Autor Teilen Geschrieben 31. Januar 2011 Nunja, wenn ich mir die definition von broadcast so durchles (was ich vorher schon getan habe) ist das genau das was ich haben will, nämlich ein server der wahllos eine eingehende nachricht an sämtliche verbundene clients verschickt oder hab ich da jetzt was falsch verstanden ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 31. Januar 2011 Teilen Geschrieben 31. Januar 2011 Wenn Du einen Broadcast einsetzen würdest, dann brauchst Du auch keinen Server. Weder Multicast noch ein Broadcast benötigen einen Server. Du solltest Dir einmal anschauen, wer der Empfänger bei einem Broadcast und bei einem Multicast Paket ist. Ein Broadcast ist sicherlich nicht das, was Du willst Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amokloipher Geschrieben 31. Januar 2011 Teilen Geschrieben 31. Januar 2011 (bearbeitet) Lies mal hier, vllt. wird dir da der Sinn klarer: MulticastSocket (Java 2 Platform SE v1.4.2) Bearbeitet 31. Januar 2011 von Amokloipher Typo Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
YujiSakaii Geschrieben 31. Januar 2011 Autor Teilen Geschrieben 31. Januar 2011 okay, ja hab verstanden was du meinst (sorry aber netzwerke lagen mir noch nie so wirklich) hab das jetzt soweit das ich einen multicast habe, ja ohne server, bei den ich auch senden und empfangen kann, nur mein problem jetzt is das man erst etwas erhält wenn man selber etwas sendet wie ist es denn möglich das man sofort eine ausgabe erhält wenn ein anderer eine eingabe tätigt ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amokloipher Geschrieben 31. Januar 2011 Teilen Geschrieben 31. Januar 2011 Der Client kann empfangen, sobald er der Multicast-Group joined. Dein Client joined der Group wahrscheinlich erst, wenn er was versendet. Würde ich mal ins blaue hinein spekulieren, so ohne Quellcode... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 31. Januar 2011 Teilen Geschrieben 31. Januar 2011 sorry aber netzwerke lagen mir noch nie so wirklich dann solltest Du damit beginnen, bevor Du eine Anwendung entwickelst, in der Du eben Netzwerk Komponenten einbauen möchtest wie ist es denn möglich das man sofort eine ausgabe erhält wenn ein anderer eine eingabe tätigt ? Lies Dich bitte in die entsprechenden Spezifikationen ein ! Diese Frage kannst Du alleine mit den Schaubildern in dem Wikipedia Artikel klären. Ansonsten empfehle ich die RFC 1112 - Host extensions for IP multicasting (RFC1112) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
speedi Geschrieben 31. Januar 2011 Teilen Geschrieben 31. Januar 2011 Informier dich doch erstmal über die zugrunde liegenden Protokolle! TCP stellt - wie ich schon sagte - so etwas wie eine Punkt- zu Punkt- Verbindung. Das kannst du vergleichen mit einem Wasserrohr. Was du auf der einen Seite reinkippst kommt auf der anderen raus. Wenn du dein Wasser an mehreren Stellen haben willst brauchst du eine Art Verteiler. Soll dein TCP-Server aus dem Internet oder WAN erreichbar sein musst du entsprechend eine Port-Weiterleitung am Router konfigurieren. Java-Klassen: Socket, ServerSocket UDP kannst du vergleichen mit einer besseren SMS. Du kannst UDP gezielt an jemanden schicken oder aber an eine bestimmte Gruppe oder an bestimmte Netze. Einen Unicast schickst du an eine besimmte eindeutige IP-Adresse oder PC-Namen. Einen Multicast empfängt jeder der sich eine bestimmte Multicast-Gruppe anmeldet. Und einen Broadcast empfängt jeder dessen IP in einem bestimmten Adressbereich liegt (kannst auch an absolut alle Broadcasten). Der Nachteil von UDP: Übers Internet wirst du Probleme bekommen. Am Router endet dein Broadcast und dein Multicast. Selbst ein Unicast geht nur übers Internet wenn du am Router entsprechende Port-Weiterleitungen konfiguriert hast. Bei UDP ist die Datenübertragung nicht gesichert. Pakete können sowohl verloren gehen als auch beschädigt werden. Ich weiß nicht welche Anforderungen du an deinen Chat hast, aber generell finde ich dafür TCP besser. Abgesehen davon verlierst du mit UDP die Privatsphäre. Stell dir vor du möchtest später noch eine "flüstern"-Funktion einbauen um irgendwas an genau einen Empfänger zu schreiben. Du kannst dann natürlich dein Protokoll so stricken, dass du den Empfänger in der Nachricht vermerkst und die anderen die Nachricht wieder verwerfen, aber wenn jemand einen anderen Client verwendet hast du keine Kontrolle mehr. Broadcast und Multicast setze ich persönlich nur ein um die Lasten zu reduzieren (Video-Broadcast/Multicast), um Konfigurationseinstellungen zu finden oder um ewigen C-Programmieren das Leben nicht noch mit zu TCP zu belasten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
speedi Geschrieben 31. Januar 2011 Teilen Geschrieben 31. Januar 2011 hab das jetzt soweit das ich einen multicast habe, ja ohne server, bei den ich auch senden und empfangen kann, nur mein problem jetzt is das man erst etwas erhält wenn man selber etwas sendet wie ist es denn möglich das man sofort eine ausgabe erhält wenn ein anderer eine eingabe tätigt ? Kanns sein, dass du versuchst im selben Thread zu empfangen und zu senden? Empfangen geht prinzipiell so: int port = 19245; byte [] buf = new byte[256*256]; MulticastSocket socket = new MulticastSocket(port); socket.joinGroup(InetAddress.getByName(232.8.8.8)); DatagramPacket p = new DatagramPacket(buf,buf.length); socket.receive(p); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 31. Januar 2011 Teilen Geschrieben 31. Januar 2011 Broadcast und Multicast setze ich persönlich nur ein um die Lasten zu reduzieren (Video-Broadcast/Multicast), um Konfigurationseinstellungen zu finden oder um ewigen C-Programmieren das Leben nicht noch mit zu TCP zu belasten. Private Messages würden sich auch via Unicast realisieren lassen. Ansonsten stimmt das schon. In einem LAN habe ich bisher sehr gute Erfahrungen mit Multicast gemacht, eben genau um mehrere zentrale Soucen zu haben, die Daten verarbeiten können. Die Koordinaten läuft komplett via Multicast. Sourcen können Daten verarbeiten und wieder an den Absender schicken oder sie sind Sender und warten, bis Datenblöcke verarbeitet wurden. Der eigentliche Datentransfer läuft dann via RMI, da Multicastpakete zu klein sind. Das Routing innerhalb einzelner LANs muss dann natürlich im Router so eingestellt sein, dass eben Multicast passend in andere Segmente geroutet werden (ist aber auch kein größeres Problem). TCP bietet sich natürlich an, wenn man einen Server im Netz betreiben will. Damit muss man eben aber auch einen Dienst passend entwickeln. Multicast bietet für eine reine LAN basierte Struktur eben weniger Overhead, in Verbindung mit Unicast erreicht man eben die entsprechende Funktionalität. Sollen die Nachrichten auch noch verschlüsselt sein, würde ich von einer paketbasierten Struktur abraten und nur die Inhalte der Nachricht verschlüsseln, wozu man Off-the-Record Messaging ? Wikipedia verwenden kann Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
YujiSakaii Geschrieben 31. Januar 2011 Autor Teilen Geschrieben 31. Januar 2011 1. das einzige was das programm können soll ist: eine eingabe von einen beliebigen client zu erhalten und diese dann an alle anderen clients verteilen, es sind keine weiteren anforderungen gestellt es soll später auch nichts weiter hinzukommen. 2. mein einziges problem zur zeit ist eben das ich nicht dahin komme das der server an sämtliche clients schickt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 31. Januar 2011 Teilen Geschrieben 31. Januar 2011 2. mein einziges problem zur zeit ist eben das ich nicht dahin komme das der server an sämtliche clients schickt Wie schon gesagt, es gibt mehrere Methoden: Wenn Du TCP verwenden willst, dann musst Du für jeden Client einen Socket im Server haben und entsprechend die Daten synchronisiert verteilen. Oder Du nimmst Multicast, wobei damit der Server überflüssig wird Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
YujiSakaii Geschrieben 1. Februar 2011 Autor Teilen Geschrieben 1. Februar 2011 Nunja hab das problem jetzt mit hilfe von ein paar schleifen gelöst und alles funktioniert wunderbar und ich habe immernoch einen server, weil das teil der aufgabe war.... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
speedi Geschrieben 1. Februar 2011 Teilen Geschrieben 1. Februar 2011 1. das einzige was das programm können soll ist: eine eingabe von einen beliebigen client zu erhalten und diese dann an alle anderen clients verteilen, es sind keine weiteren anforderungen gestellt es soll später auch nichts weiter hinzukommen. Ok. Damit sind die privaten Messages schonmal raus. Aber wie schon gesagt: Wenn der Chat auch übers Internet funktionieren soll oder anderweitige Netzübergreifend bietet sich UDP (MulticastSocket oder DatagramSocket weniger an, da dann Broadcast/Multicast am Router hängen bleibt und für Unicast sämtliche Router hinten denen die Clients sitzen entsprechend konfiguriert sein müssten). Simple lokale Variante: Wenn das Ding nur im LAN funktionieren soll dann schmeiß dein ServerSocket und Socket zeugs weg und nimm wie flashpixx vorschlägt einen MulticastSocket. Der zentale Server fällt dann komplett weg und die Clients melden sich lediglich an die MulticastGroup an um Nachrichten zu empfangen. Und senden Packete an die MulticastGroup. TCP-Variante: Dein jetziger Code ist ganz ok aber wie ich schon sagte: Dein Server sendet die Nachricht nur an den Sender der Nachricht. Du musst da bissl modifizieren: Lager deinen Server-Kern in eine Klasse und verpasse dieser Klasse eine Liste in der du die Verbindungen speicherst: import java.io.*; import java.net.*; import java.util.LinkedList; public class ServerTest { private LinkedList<SocketHandler> receivedSockets = new LinkedList<SocketHandler>(); public ServerTest() throws IOException { ServerSocket serverSocket = serverSocket = new ServerSocket(4444); Socket clientSocket = null; for (int i = 1;; i++) { try { clientSocket = serverSocket.accept(); System.out.println("Client eingetroffen"); SocketHandler sh = new SocketHandler(this, clientSocket, i); sh.start(); clientSocket = null; } catch (IOException e) { System.err.println("Accept failed: 4444"); System.exit(-1); } } } public void sendMessage(String message) { for (SocketHandler handler : receivedSockets) { handler.sendMessage(message); } } public static void main(String[] args) { try { new ServerTest(); System.out.println("Server gestartet"); } catch (IOException e) { System.err.println("Das ist nicht möglich!"); System.exit(-1); } } } 2. pass deinen SocketHandler darauf an: import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class SocketHandler extends Thread { private Socket socket; private int ID; private ServerTest serverTest; private PrintWriter ausgabe; public SocketHandler(ServerTest serverTest, Socket clientSocket, int i) { socket = clientSocket; ID = i; this.serverTest = serverTest; } public void run() { try { ausgabe = new PrintWriter(socket.getOutputStream(), true); BufferedReader eingabe = new BufferedReader(new InputStreamReader( socket.getInputStream())); ausgabe.println("Der Server hat dich als Nummer" + ID + " verbunden"); System.out.println("Der Server hat sich mit Nummer" + ID + " verbunden"); String inputLine; while ((inputLine = eingabe.readLine()) != null) { System.out.println("User" + ID + inputLine); if (inputLine.equals("Bye")) { break; } Scanner scan = new Scanner(System.in); String antwort = scan.nextLine(); serverTest.sendMessage(inputLine); } ausgabe.println("Der Server trennt die Verbindung mit dir"); System.out.println("Der Server trennt die Verbingung mit Nummer" + ID); ausgabe.close(); eingabe.close(); socket.close(); } catch (Exception e) { } } public void sendMessage(String message){ ausgabe.println(message); } } WICHTIG: - Das ist nur eine Demo wie man ganz prinzipiell dafür sorgen kann, dass Messages an alle verteilt werden. - Da der code deiner Scanner-Klasse nicht vorliegt weiß ich nicht ob ich das jetzt so richtig implementiert hab. Jedenfalls bekommen jetzt alle genau das was vorher der Sender der Nachricht vom Server bekommen hat. - Meine sendMessage-Routine fängt keine IOException ab. Das sollte man aber tun. Überleg dir was sonst passiert, wenn der erste Client in der Liste mittlerweile offline ist. - Wenn ein Client offline geht (IOException oder eingabe.readLine() = null) sollte ihn der Server aus der Liste nehmen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
speedi Geschrieben 1. Februar 2011 Teilen Geschrieben 1. Februar 2011 Nunja hab das problem jetzt mit hilfe von ein paar schleifen gelöst und alles funktioniert wunderbar und ich habe immernoch einen server, weil das teil der aufgabe war.... Cool. Na dann hat sichs ja erledigt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
YujiSakaii Geschrieben 10. Februar 2011 Autor Teilen Geschrieben 10. Februar 2011 So falls es jemanden intressiert kann ich ja mal meinen jetzigen quelltext posten als erstes der Server package Chat; import java.io.*; import java.net.*; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; public class MultiThreadChatServer { private static Socket clientSocket = null; private static ServerSocket serverSocket = null; private static clientThread t[] = new clientThread[10]; private static FileWriter fw = null; private static PrintWriter pw = null; public static void main(String args[]) { String logspeicher ="C:\\Dokumente und Einstellungen\\test.log"; File file = new File(logspeicher); Calendar cal = Calendar.getInstance(); try { fw = new FileWriter(file.getPath(), true); } catch (IOException ex) { Logger.getLogger(MultiThreadChatServer.class.getName()).log(Level.SEVERE, null, ex); } pw = new PrintWriter( fw ); System.out.println("Geben sie den zu benutzenden Port an"); Scanner scan = new Scanner (System.in); int port_number = scan.nextInt(); System.out.println("Benutze den Java MultiThreadChatServer\nEs wird der Port "+port_number+" benutzt"); pw.printf("<%tT>\n",cal); pw.println("Der Server wurder gestartet"); try { //Erstelle Socket auf Port 2222 serverSocket = new ServerSocket(port_number); } catch (IOException e) { //Fehlerausgabe System.out.println(e); } while(true) { try { //Akzeptiere Client (max. 10) clientSocket = serverSocket.accept(); for(int i=0; i<=9; i++) { if(t[i]==null) { //Starte Thread (t[i] = new clientThread(clientSocket,t)).start(); break; } } } catch (IOException e) { //Fehlerausgabe System.out.println(e); } finally { pw.printf("<%tT>\n",cal); pw.println("Der Server wurde Geschlossen"); try { fw.flush(); fw.close(); pw.flush(); pw.close(); } catch (IOException ex) { Logger.getLogger(MultiThreadChatServer.class.getName()).log(Level.SEVERE, null, ex); } } } } } jetzt der clientthread package Chat; import java.io.*; import java.net.*; import java.sql.SQLException; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; class clientThread extends Thread { private DataInputStream is = null; private PrintStream os = null; private Socket clientSocket = null; private clientThread t[]; private FileWriter fw = null; private PrintWriter pw = null; public clientThread(Socket clientSocket, clientThread[] t) { this.clientSocket=clientSocket; this.t=t; } @Override public void run() { String line; try { //Ein-/Ausgabe Festlegen String logspeicher ="C:\\Dokumente und Einstellungen\\test.log"; File file = new File(logspeicher); fw = new FileWriter( file.getPath() , true ); pw = new PrintWriter( fw ); is = new DataInputStream(clientSocket.getInputStream()); os = new PrintStream(clientSocket.getOutputStream()); pw.println("Ein User ist dem Chat beigetreten."); //Eingabeaufforderung abfragen passwort = new abfragen(clientSocket); String name = passwort.abfragen(clientSocket); pw.println("Der User hat den Namen"+ name); //Willkommensgruß os.println("<Herzlich Willkommen "+name+" in unseren Chatroom.>\n<Um den Raum zu verlassen Tippe /quit in eine neue Zeile>"); for(int i=0; i<=9; i++) { if (t[i]!=null && t[i]!=this) { //Ausgabe an andere das ein neuer Client beigetreten ist t[i].os.println("*** Der Benutzer "+name+" hat den Chatroom betreten !!! ***" ); } } while (true) { line = is.readLine(); //Abbruchbedingung if(line.startsWith("/quit")) { pw.println("Der User "+ name+ " hat den Chatroom verlassen"); break; } for(int i=0; i<=9; i++) { if (t[i]!=null && t[i] !=this) { //Ausgabe der erhaltenen Nachricht an alle außer den Verfasser Calendar cal = Calendar.getInstance(); t[i].os.printf("<%tT>\n",cal); //Zeit t[i].os.println("<"+name+"> \n"+line); //Text pw.printf("<%tT>\n",cal); pw.println("<"+name+"> \n"+line); } } } for(int i=0; i<=9; i++) { if (t[i]!=null && t[i]!=this) { //Ausgabe an andere das jmd den Chat verlassen hat t[i].os.println("*** Der Benutzer "+name+" hat den Raum verlassen !!! ***" ); } } //Ausgabe an den der den Chat verlässt os.println("<*** Auf Wiedersehen "+name+" ***>"); for(int i=0; i<=9; i++) { if (t[i]==this) { //Null setzen des jeweiligen platzes im array das ein neuer Client beitreten kann t[i]=null; } } } catch (SQLException ex) { Logger.getLogger(clientThread.class.getName()).log(Level.SEVERE, null, ex); } //fehlerausgabe catch(IOException e) { System.out.println(e); } finally { try { fw.flush(); fw.close(); pw.flush(); pw.close(); is.close(); clientSocket.close(); os.close(); } catch (IOException e) { Logger.getLogger(clientThread.class.getName()).log(Level.SEVERE, null, e); } } } } nun die passwort abfrage /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package Chat; import com.mysql.jdbc.Connection; import com.mysql.jdbc.Statement; import java.io.DataInputStream; import java.io.IOException; import java.io.PrintStream; import java.net.Socket; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author Administrator */ public class abfragen { private DataInputStream is = null; private PrintStream os = null; private String nick; private final Socket clientSocket; abfragen(Socket clientSocket) { this.clientSocket=clientSocket; } public String abfragen (Socket clientSocket) throws SQLException { boolean test = false; int i = 3; try { is = new DataInputStream(clientSocket.getInputStream()); os = new PrintStream(clientSocket.getOutputStream()); os.println("Haben sie bereits einen account ?\n Ja/Nein"); String account = is.readLine(); if (account.equals("Ja")) { while (test == false) { os.println("Geben sie den Benutzernamen ein:"); nick = is.readLine(); os.println("Geben sie das Passwort ein:"); String pw = is.readLine(); String connStr = "jdbc:mysql://localhost:3306/" + "benutzerverwaltung?user=*****&password=*****"; String statement = "Select name, passwort from nutzer where name = '" + nick + "' and passwort = '" + pw + "'"; Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = (Connection) DriverManager.getConnection(connStr); java.sql.Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(statement); if (rs.next() == false) { test = false; i--; os.println("Benutzername oder Passwort war falsch!\n Sie haben noch"+i+"Versuche"); if (i<=0) { os.println("Keine Versuche mehr übrig"); System.exit(0); } } else { os.println("Zugang gewaehrt"); test = true; } } catch (ClassNotFoundException e) { os.println(e); } catch (SQLException e) { os.println(e); } finally { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block System.out.println(e); } } } } else { os.println("Gewuenschter Nickname:"); nick = is.readLine(); os.println("Gewuenschtes Passwort"); String pw = is.readLine(); String connStr = "jdbc:mysql://localhost:3306/" + "benutzerverwaltung?user=root&password=system"; String statement = "INSERT INTO nutzer (name,passwort)" + "VALUES ('" + nick + "', " + "'" + pw + "')"; Connection conn = null; try { //Verbindung aufbauen Class.forName("com.mysql.jdbc.Driver"); conn = (Connection) DriverManager.getConnection(connStr); //Statement deklarieren und ausführen Statement stmt = (Statement) conn.createStatement(); stmt.executeUpdate(statement); } catch (ClassNotFoundException e) { os.println(e); } catch (SQLException e) { os.println(e); }finally { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block System.out.println(e); } } } } catch (IOException ex) { Logger.getLogger(abfragen.class.getName()).log(Level.SEVERE, null, ex); } return nick; } } und zum schluss der chatclient package Chat; import java.io.*; import java.net.*; import com.sun.jna.*; import java.util.Scanner; import java.util.logging.Level; import java.util.logging.Logger; public class MultiThreadChatClient implements Runnable { // Deklarationen // os = output stream // is = input stream private static Socket clientSocket = null; private static PrintStream os = null; private static DataInputStream is = null; private static BufferedReader inputLine = null; private static boolean closed = false; public static void main(String[] args) { //standard port System.out.println("Geben sie bitte den zu benutzenden Port an."); Scanner scan = new Scanner (System.in); int port_number = scan.nextInt(); String host="LocalHost"; System.out.println("Benutze den Java MultiThreadChatClient \n"+"Der Host"+host+", mit der Portnummer "+port_number+" wird angesprochen"); // Versuche Socket auf gegebenen Host und Port zu zuzugreifen // Deklariere is/os und inputLine try { clientSocket = new Socket(host, port_number); inputLine = new BufferedReader(new InputStreamReader(System.in)); os = new PrintStream(clientSocket.getOutputStream()); is = new DataInputStream(clientSocket.getInputStream()); } catch (UnknownHostException e) { //Fehlerausgabe System.err.println("Kenne den Host "+host+" nicht"); } catch (IOException e) { System.err.println("Bekomme keine I/O Verbindung zum Host"+host); } if (clientSocket != null && os != null && is != null) { try { //Erstelle einen Thread um vom Server zu lesen new Thread(new MultiThreadChatClient()).start(); while (!closed) { os.println(inputLine.readLine()); } } catch (IOException e) { //Fehlerausgabe System.err.println("IOException: " + e); } finally { try { is.close(); clientSocket.close(); os.close(); } catch (IOException ex) { Logger.getLogger(MultiThreadChatClient.class.getName()).log(Level.SEVERE, null, ex); } } } } public interface Kernel32 extends Library { public boolean Beep (int FREQUENCY, int DURATION); public void Sleep (int DURATION); } public void run() { String responseLine; Kernel32 lib = (Kernel32) Native.loadLibrary("kernel32",Kernel32.class); try { while ((responseLine = is.readLine()) != null) { //Ausgabe der Zeile die vom Server kommt if(responseLine.startsWith("<")) { } else { lib.Beep(280, 100); lib.Beep(348, 100); lib.Beep(420, 200); lib.Beep(348, 100); lib.Beep(420, 400); } if(responseLine.startsWith("Tetris")) { lib.Sleep(850 / 4); lib.Beep(329 * 2, 850 / 4); lib.Beep(493 * 1, 850 / 8); lib.Beep(261 * 2, 850 / 8); lib.Beep(293 * 2, 850 / 4); lib.Beep(261 * 2, 850 / 8); lib.Beep(493 * 1, 850 / 8); lib.Beep(440 * 1, 850 / 4); lib.Beep(440 * 1, 850 / 8); lib.Beep(261 * 2, 850 / 8); lib.Beep(329 * 2, 850 / 8); lib.Beep(329 * 2, 850 / 8); lib.Beep(293 * 2, 850 / 8); lib.Beep(261 * 2, 850 / 8); lib.Beep(493 * 1, 1700 / 5); lib.Beep(261 * 2, 850 / 8); lib.Beep(293 * 2, 850 / 4); lib.Beep(329 * 2, 850 / 4); lib.Beep(261 * 2, 850 / 4); lib.Beep(440 * 1, 850 / 4); lib.Beep(440 * 1, 850 / 4); lib.Sleep(850 / (8 / 3)); lib.Beep(293 * 2, 3400 / 13); lib.Beep(349 * 2, 850 / 8); lib.Beep(440 * 2, 850 / 8); lib.Beep(440 * 2, 850 / 8); lib.Beep(391 * 2, 850 / 8); lib.Beep(349 * 2, 850 / 8); lib.Beep(329 * 2, 850 / 3); lib.Beep(261 * 2, 850 / 8); lib.Beep(329 * 2, 850 / 8); lib.Beep(329 * 2, 850 / 8); lib.Beep(293 * 2, 850 / 8); lib.Beep(261 * 2, 850 / 8); lib.Beep(493 * 1, 850 / 4); lib.Beep(493 * 1, 850 / 8); lib.Beep(261 * 2, 850 / 8); lib.Beep(293 * 2, 850 / 4); lib.Beep(329 * 2, 850 / 4); lib.Beep(261 * 2, 850 / 4); lib.Beep(440 * 1, 850 / 4); lib.Beep(440 * 1, 850 / 4); } System.out.println(responseLine); //Abbruchbedingung if (responseLine.indexOf("*** Auf Wiedersehen") != -1) { break; } } closed=true; } catch (IOException e) { //Fehlerausgabe System.err.println("IOException: " + e); } } } damit es so funktioniert sind zusätzlich mysql-connector-java-5.1.15 und com.sun.jna.native sowieso com.sun.jna.library nötig Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.