Écrit avant:
C'est peut-être la fin de la période, et divers conceptions de cours en viennent les unes après les autres. Récemment, j'ai vu deux questions et réponses sur CSSDN, qui est d'écrire un programme de chat basé sur des douilles. J'avais fait quelque chose avec Socket récemment. Par intérêt, j'ai pris quelques nuits de temps libre pour en frapper un. Actuellement, il ne prend en charge que les fonctions de chat, de chat de groupe et de transfert de fichiers. Tout d'abord, j'ai publié une image de programme laide (l'interface utilisateur est écrite dans Java Swing, j'ai oublié celle-ci pendant longtemps, donc je n'ai pas pu m'empêcher de lire l'API JDK pour en écrire un), comme illustré ci-dessous:
Conception du serveur:
Le serveur a deux opérations principales: l'une consiste à bloquer la prise du client récepteur et à effectuer un traitement de réponse, et l'autre est de détecter le rythme cardiaque du client. Si le client n'envoie pas de rythme cardiaque pendant une période de temps, supprimez le client, créez le Serversocket, puis démarrez deux pools de threads pour gérer ces deux choses (newFixEdThreadPool, NewscheduleDThreadPool). Les classes de traitement correspondantes sont SocketDispatcher et Socketschedule. Le socketdispatcher est distribué à différents anciens de sockethandlers en fonction de différentes demandes de socket. SocketWrapper ajoute un wrapper à coque à la prise et enregistre le dernier temps d'interaction de la prise avec le socketholder stocke la collection de socket qui interagit actuellement avec le serveur. La conception est la suivante:
Conception du client:
La conception du client est principalement divisée en deux parties, à savoir la conception du module de communication de socket et la conception liée à l'interface utilisateur
La conception de la communication du socket client est en fait similaire à celle du serveur. La différence est que le serveur reçoit des paquets de battements de cœur, tandis que le client envoie des paquets de battements cardiaques. Étant donné que le client ne communique qu'avec un seul serveur (la communication entre les clients est également distribuée par le serveur), seul un pool de threads de taille 2 est utilisé pour gérer ces deux choses (newFixEdThreadPool (2)). Les classes de traitement correspondantes sont ReceiveListERner et Keepalivedog. Lorsque le receiouslener est initialisé, un rappel est envoyé sous forme de rappel au client reçoit le message du serveur. L'implémentation par défaut du rappel est defaultCallback. DefaultCallback est distribué à différents gestionnaires via HF en fonction de différents événements. Le titulaire du client stocke les informations actuelles du client. La conception est la suivante:
Conception liée à l'interface utilisateur, je n'ai pas l'intention d'écrire l'interface utilisateur par moi-même. Après tout, ce que j'ai écrit est trop laid, donc je peux demander à mes camarades de classe ou à mes amis de m'aider à le frapper plus tard, alors je remets le traitement de l'événement de l'interface utilisateur à l'action pour le gérer, et je sépare simplement la conception de l'interface utilisateur et la réponse de l'événement. Toutes les UIS héritent de JFrame et implémentent l'interface de vue. La classe d'implémentation du gestionnaire ci-dessus est obtenue via le routeur (il sera retourné directement s'il existe, et il sera créé et stocké s'il n'existe pas). La vue fournit l'interface utilisateur (), obtenez un conteneur (), obtenez les composants dans l'interface utilisateur GetComponent (), Display Display () et Recycle Trash (); ResultWrapper et Resultholder sont juste pour créer et stocker des onglets de chat.
Conception du module commun:
Le module commun est principalement l'interaction des données, où les données JSON sont utilisées pour l'interaction. Le module commun définit divers types d'informations d'interaction, la transmission des informations de socket implémentées par Sendhelper, i18n est la langue, et la valeur constante est la configuration et les constantes du système (les constantes sont toutes des interfaces, qui peuvent ne pas être très bonnes). Pour ReturnMessage, il a une série de DTOS comme attributs de contenu.
Entrée du programme:
Enfin, le programme d'entrée pour le serveur et le client est donné (le code complet est accroché au CSDN, et il sera mis à jour en continu si vous avez le temps, et l'article aura une adresse à la fin)
Portail du serveur:
package yaolin.chat.server; import java.io.ioException; import java.net.serversocket; import java.util.date; import java.util.concurrent.executervice; import java.util.concurrent.executors; importer java.util.concurrent.scheduledExExEx java.util.concurrent.timeUnit; import yaolin.chat.common.constantValue; import yaolin.chat.util.loggerutil; / ** * server * @author yaolin * / public class server {private final Serversocket Server; Pool de service d'exécution final privé; public Server () lève ioException {server = new Serversocket (constantValue.server_port); Pool = exécutoires.NewFixEdThreadPool (constantValue.max_pool_size); } public void start () {try {ScheduleDexeCutOrService schedule = exécutors.newscheduledThreadpool (1); // Regardez le chien. Exception?? schedule.scheduleAtFixeDrate (new socketschedule (), 10, constanteValue.time_out, timeunit.seconds); while (true) {pool.execute (new socketdispatcher (server.accept ())); LoggerUtil.info ("Acceptez un client à" + new Date ()); }} catch (ioException e) {pool.shutdown (); }} public static void main (string [] args) {try {new server (). start (); } catch (ioException e) {LoggerUtil.Error ("Le démarrage du serveur a échoué! ->" + e.getMessage (), e); }}} Portail client:
package yaolin.chat.client; import java.io.ioexception; import javax.swing.joptionpane; import yaolin.chat.client.callback.defaultcallback; import yaolin.chat.client.view.router; import yaolin.chat.client.view *glgistandlogy * / public class niloayChat {public static void main (String [] args) {registerAndLoginView v = (registerAndLoginView) router.getView (registerAndLoginView.class) .Create (); essayez {v.display (); Client client = nouveau client (nouveau defaultCallback ()); client.start (); ClientHolder.SetClient (client); } catch (ioException e) {jOptionPane.showMessageDialog (v.getContentPane (), e.getMessage ()); }}} Téléchargement du code source: démo
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.