Escrito antes:
Tal vez sea el final del período, y varios diseños de cursos están llegando uno tras otro. Recientemente, vi dos preguntas y respuestas en CSSDN, que es escribir un programa de chat basado en socket. Hice algo con Socket recientemente. Por interés, tomé unas noches de tiempo libre para golpear uno. Actualmente, solo admite funciones de chat, chat grupal y transferencia de archivos. Primero, publiqué una imagen de programa feo (UI está escrita en Java Swing, he olvidado esta durante mucho tiempo, así que no pude evitar leer la API JDK para escribir una), como se muestra a continuación:
Diseño del servidor:
El servidor tiene dos operaciones principales: una es bloquear el zócalo del cliente receptor y realizar el procesamiento de respuesta, y el otro es detectar el latido del cliente. Si el cliente no envía un latido por un período de tiempo, elimine el cliente, cree el SerververSocket y luego inicie dos grupos de subprocesos para manejar estas dos cosas (NewFixedThreadPool, NewsCheduledThreadPool). Las clases de procesamiento correspondientes son SocketDispatcher y SocketsChedule. El SocketDispatcher se distribuye a diferentes asquetadores de acuerdo con diferentes solicitudes de socket. Socketwrapper agrega un envoltorio de shell al socket y registra el último tiempo de interacción del socket con el scocketholder almacena la colección de socket que actualmente interactúa con el servidor. El diseño es el siguiente:
Diseño del cliente:
El diseño del cliente se divide principalmente en dos partes, a saber, el diseño del módulo de comunicación del socket y el diseño relacionado con la interfaz de usuario
El diseño de la comunicación del socket del cliente es realmente similar al del servidor. La diferencia es que el servidor recibe paquetes de latidos, mientras que el cliente envía paquetes de latidos. Dado que el cliente solo se comunica con un servidor (la comunicación entre los clientes también está distribuida por el servidor), solo se utiliza un hilo de tamaño 2 para manejar estas dos cosas (NewFixedThreadPool (2)). Las clases de procesamiento correspondientes son ReceptiveListener y KeepAlivedog. Cuando se inicializa el recepcionero, se envía una devolución de llamada como una devolución de llamada al cliente recibe el mensaje del servidor. La implementación predeterminada de la devolución de llamada es defaultCallback. DefaultCallback se distribuye a diferentes manejadores a través de HF de acuerdo con diferentes eventos. El titular del cliente almacena la información actual del cliente. El diseño es el siguiente:
Diseño relacionado con la interfaz de usuario, no planeo escribir la interfaz de usuario por mí mismo. Después de todo, lo que escribí es demasiado feo, por lo que puedo pedirle a mis compañeros de clase o amigos que me ayuden a golpearlo más tarde, así que entrego el procesamiento de eventos de UI a la acción para manejarlo, y simplemente separar el diseño de la interfaz de usuario y la respuesta de eventos. Todas las UI heredan jframe e implementan la interfaz de vista. La clase de implementación del controlador anterior se obtiene a través del enrutador (se devolverá directamente si existe, y se creará y almacenará si no existe). La vista proporciona la creación UI (), obtiene contenedor (), obtiene los componentes en la ui getComponent (), Display Display () y recicla basura (); Resultwrapper y Resultholder son solo para crear y almacenar pestañas de chat.
Diseño de módulo común:
El módulo común es principalmente la interacción de datos, donde los datos JSON se utilizan para la interacción. El módulo común define varios tipos de información de interacción, la transmisión de la información del socket implementada por SendHelper, I18N es el lenguaje, y ConstantValue es la configuración y las constantes en el sistema (las constantes son todas las interfaces, que pueden no ser muy buenas). Para ReturnMessage, tiene una serie de DTO como atributos de contenido.
Entrada del programa:
Finalmente, se proporciona el programa de entrada para el servidor y el cliente (el código completo se coloca en CSDN y se actualizará continuamente si tiene tiempo, y el artículo tendrá una dirección al final)
Portal del servidor:
paquete yaolin.chat.server; import java.io.ioException; import java.net.serversocket; import java.util.date; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import java.util.concurrent.scheduledexecutorservice; import; java.util.concurrent.timeunit; import yaolin.chat.common.constantValue; import yaolin.chat.util.loggerutil;/*** servidor* @author yaolin*/servidor de clase pública {servidor de servidor final privado; Grupo de servicio de ejecutores finales privados; Public Server () lanza ioexception {servidor = new ServerSocket (constantValue.server_port); Pool = Ejecutors.NewFixedThreadPool (constantValue.max_pool_size); } public void start () {try {ProgramedExecutorService programar = Ejecutors.NeWSCheduledThreadPool (1); // Mira perro. ¿¿Excepción?? shiteb.scheduleatFixedRate (nuevo SocketSchedule (), 10, ConstantValue.time_out, TimeUnit.seconds); while (true) {Pool.execute (nuevo SocketDisPatcher (server.accept ())); LoggerUtil.info ("Aceptar un cliente en" + nueva fecha ()); }} Catch (IOException e) {Pool.shutdown (); }} public static void main (string [] args) {try {new Server (). Start (); } Catch (ioException e) {loggerUtil.error ("Servidor Start falló! ->" + e.getMessage (), e); }}} Portal del cliente:
paquete 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.view yaolin * */public class niloaychat {public static void main (string [] args) {registroandloginview v = (registroandloginview) router.getview (registro yginview.class) .create (); intente {v.display (); Client Client = New Client (New DefaultCallback ()); client.start (); ClientHolder.SetClient (Cliente); } Catch (ioException e) {joptionPane.ShowMessEdialog (V.getContentPane (), E.GetMessage ()); }}} Descarga del código fuente: demostración
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.