Vorher geschrieben:
Vielleicht ist es das Ende der Zeit und verschiedene Kursentwürfe kommen nacheinander. Kürzlich habe ich zwei Fragen und Antworten auf CSSDN gesehen, nämlich ein Socket-basierter Chat-Programm zu schreiben. Ich habe kürzlich etwas mit Socket gemacht. Aus Interesse nahm ich mir ein paar Nächte Freizeit, um einen zu klopfen. Derzeit unterstützt es nur einzelne Chat-, Gruppenchat- und Dateiübertragungsfunktionen. Zuerst habe ich ein hässliches Programmbild gepostet (die UI ist in Java Swing geschrieben, ich habe es schon lange vergessen, also konnte ich nicht anders, als die JDK -API zu lesen, um einen zu schreiben), wie unten gezeigt:
Serverdesign:
Der Server verfügt über zwei Hauptvorgänge: Einer besteht darin, den Socket des empfangenden Clients zu blockieren und die Antwortverarbeitung durchzuführen. Der andere ist die Erkennung des Herzschlags des Clients. Wenn der Kunde für einen bestimmten Zeitraum keinen Herzschlag sendet, entfernen Sie den Client, erstellen Sie das Serversocket und starten Sie dann zwei Thread -Pools, um diese beiden Dinge zu verarbeiten (Newfixed Threadpool, Newsschoned threadpool). Die entsprechenden Verarbeitungsklassen sind SocketDispatcher und Socketplane. Der SocketDispatcher wird gemäß verschiedenen Socket -Anfragen an verschiedene Sockhandler verteilt. SocketWrapper fügt dem Socket einen Shell -Wrapper hinzu und zeichnet die neueste Interaktionszeit des Socket mit dem Socketholder auf, der die Socket -Sammlung speichert, die derzeit mit dem Server interagiert. Das Design lautet wie folgt:
Kundendesign:
Das Kundendesign ist hauptsächlich in zwei Teile unterteilt, nämlich Socket -Kommunikationsmoduldesign und UI -bezogenes Design
Das Design der Client -Socket -Kommunikation ähnelt tatsächlich der des Servers. Der Unterschied besteht darin, dass der Server Herzschlagpakete erhält, während der Client Herzschlagpakete sendet. Da der Client nur mit einem Server kommuniziert (die Kommunikation zwischen den Clients wird auch vom Server verteilt), wird nur ein Thread -Pool mit Größe 2 verwendet, um diese beiden Dinge zu verarbeiten (Newfixed Threadpool (2)). Die entsprechenden Verarbeitungsklassen werden empfohlen und Keepalivedog. Wenn der Empfänger initialisiert wird, wird ein Rückruf als Rückruf an den Client gesendet. Empfängt die Servernachricht. Die Standardimplementierung von Callback ist defaultCallback. DefaultCallback wird über HF nach verschiedenen Ereignissen an verschiedene Handler verteilt. Der Kundeninhaber speichert die aktuellen Kundeninformationen. Das Design lautet wie folgt:
UI -bezogenes Design, ich habe nicht vor, die Benutzeroberfläche alleine zu schreiben. Schließlich ist das, was ich geschrieben habe, zu hässlich, deshalb kann ich meine Klassenkameraden oder Freunde bitten, mir zu helfen, sie später zu klopfen, also übergeben ich die UI -Event -Verarbeitung an die Aktion, um sie zu handhaben, und trennen einfach die UI -Design- und Ereignisantwort. Alle UIS erben JFrame und implementieren die Ansichtsschnittstelle. Die obige Handler -Implementierungsklasse wird über Router erhalten (sie wird direkt zurückgegeben, wenn sie existiert, und wird erstellt und gespeichert, wenn es nicht existiert). Die Ansicht liefert die UI -Erstellung (), den Container () erhalten, die Komponenten in der UI getComponent (), Display Display () und recycelnem Mülleimer () erhalten. Ergebniswrapper und Resultholder dienen nur zum Erstellen und Speichern von Chat -Registerkarten.
Common Modul Design:
Das gemeinsame Modul ist hauptsächlich die Dateninteraktion, wobei JSON -Daten zur Interaktion verwendet werden. Das gemeinsame Modul definiert verschiedene Arten von Interaktionsinformationen, die von SendHelper implementierte Übertragung von Socket -Informationen, I18N ist die Sprache, und Konstantvalue ist die Konfiguration und Konstanten im System (die Konstanten sind alle Schnittstellen, die möglicherweise nicht sehr gut sind). Für ReturnMessage verfügt es über eine Reihe von DTOs als Inhaltsattribute.
Programmeintrag:
Schließlich wird das Eintrittsprogramm für Server und Client angegeben (der vollständige Code wird an CSDN aufgehängt und wird kontinuierlich aktualisiert, wenn Sie Zeit haben, und der Artikel hat am Ende eine Adresse).
Serverportal:
Paket yaolin.chat.server; import Java.io.ioxception; import java.net.serversocket; import Java.util.date; import Java.util.concurrent.executorservice; java.util.concurrent privater Final Executorservice Pool; public server () löscht IOException {Server = new ServerSocket (ConstantValue.server_port); pool = ausführende } public void start () {try {plantedexecutorService -Zeitplan = Executors.NewScheduledThreadpool (1); // Hunde beobachten. Ausnahme?? Schedule.ScheduleatFixedRate (New SocketSchedule (), 10, ConstantValue.time_out, TimeUnit.seconds); while (true) {pool.execute (neuer SocketDispatcher (server.accept ())); Loggerutil.info ("einen Client bei" + New Date ()); }} catch (ioException e) {pool.shutdown (); }} public static void main (String [] args) {try {new server (). start (); } catch (ioException e) {loggerutil.Error ("Serverstart fehlgeschlagen! ->" + e.getMessage (), e); }}} Client -Portal:
Paket yaolin.chat.client; import Java.io.ioException; import Javax.swing.joptionpane; importieren yaolin.chat.client.callback.DefaultCallback; importieren yaolin.chat.client.client.router; yaolin * */public class niloaychat {public static void main (String [] args) {RegisterAndloginView v = (RegisterAndloginView) Router.getView (RegisterandLoginView.class) .Create (); try {v.display (); Client Client = new client (new defaultCallback ()); Client.Start (); ClientHolder.SetClient (Client); } catch (ioException e) {joptionpane.showMessagedialog (v.getContentPane (), E.getMessage ()); }}} Quellcode -Download: Demo
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.