Escrito antes:
Talvez seja o fim do período, e vários projetos de cursos estão chegando um após o outro. Recentemente, vi duas perguntas e respostas no CSSDN, que é escrever um programa de bate-papo baseado em soquete. Por acaso, fiz algo com soquete recentemente. Sem interesse, tomei algumas noites de tempo livre para bater em uma. Atualmente, ele suporta apenas funções de bate -papo único, bate -papo em grupo e transferência de arquivos. Primeiro, publiquei uma imagem feia do programa (a interface do usuário está escrita em Java Swing, esqueci este há muito tempo, então não pude deixar de ler a API JDK para escrever uma), como mostrado abaixo:
Design do servidor:
O servidor possui duas operações principais: uma é bloquear o soquete do cliente receptor e executar o processamento de respostas, e o outro é detectar o batimento cardíaco do cliente. Se o cliente não enviar um batimento cardíaco por um período de tempo, remova o cliente, crie o ServerSocket e inicie dois pools de threads para lidar com essas duas coisas (newFixedThreadpool, NewsCheduledthreadpool). As classes de processamento correspondentes são SocketDispatcher e SocketSchedule. O SocketDispatcher é distribuído a diferentes suportes de acordo com diferentes solicitações de soquete. O SocketWrapper adiciona um invólucro de shell ao soquete e registra o tempo de interação mais recente do soquete com o Socketholder armazena a coleção de soquete que atualmente interage com o servidor. O design é o seguinte:
Design do cliente:
O design do cliente é dividido principalmente em duas partes, ou seja, design de módulo de comunicação de soquete e design relacionado à interface do usuário
O design da comunicação do soquete do cliente é realmente semelhante ao do servidor. A diferença é que o servidor recebe pacotes de batimentos cardíacos, enquanto o cliente envia pacotes de batimentos cardíacos. Como o cliente se comunica apenas com um servidor (a comunicação entre clientes também é distribuída pelo servidor), apenas um pool de threads do tamanho 2 é usado para lidar com essas duas coisas (newFixedThreadpool (2)). As classes de processamento correspondentes são o Receivenener e o Keepalivedog. Quando o Receivenener é inicializado, um retorno de chamada é enviado como um retorno de chamada para o cliente recebe a mensagem do servidor. A implementação padrão do retorno de chamada é o DefaultCallback. DefaultCallback é distribuído a diferentes manipuladores através da HF, de acordo com diferentes eventos. O cliente armazena as informações atuais do cliente. O design é o seguinte:
Design relacionado à interface do usuário, não pretendo escrever a interface do usuário. Afinal, o que escrevi é muito feio, para que eu possa pedir aos meus colegas de classe ou amigos que me ajudem a bater mais tarde, então entrego o processamento de eventos da interface do usuário à ação para lidar com isso e simplesmente separar o design da interface do usuário e a resposta do evento. Todas as UIs herdam JFrame e implementam a interface de visualização. A classe de implementação do manipulador acima é obtida através do roteador (ela será retornada diretamente se existir e será criada e armazenada se não existir). A visualização fornece a criação da interface do usuário (), obtenha contêiner (), obtenha os componentes no UI getComponent (), exibir display () e reciclar Trash (); ResultWrapper e ResultTholder são apenas para criar e armazenar guias de bate -papo.
Design comum do módulo:
O módulo comum é principalmente a interação de dados, onde os dados JSON são usados para interação. O módulo comum define vários tipos de informações de interação, a transmissão de informações de soquete implementadas pelo SendHelper, i18n é o idioma e o constantValue é a configuração e as constantes no sistema (as constantes são todas interfaces, o que pode não ser muito bom). Para o retorno, ele possui uma série de DTOs como atributos de conteúdo.
Entrada do programa:
Finalmente, o programa de entrada para o servidor e o cliente é fornecido (o código completo é pendurado no CSDN e será atualizado continuamente se você tiver tempo, e o artigo terá um endereço no final)
Portal do servidor:
pacote yaolin.chat.server; importar java.io.ioException; importar java.net.serversocket; importar java.util.date; importar java.util.concurrent.executorService; import java.util.Concurrent.Executores; importação java.util.Concurntice; java.util.concurrent.timeunit; importar yaolin.chat.common.constantValue; importar yaolin.chat.util.loggerutil;/*** servidor* @author yaolin*/public class Server {private Final ServerSocket Server; Pool de ExecutoraService Final Service privado; public server () lança ioexception {server = new ServerSocket (constantValue.server_port); pool = executores.newfixedThreadpool (constantValue.max_pool_size); } public void start () {try {scheduledExecutorService cronograma = executores.newscheduledthreadpool (1); // Assista a cachorro. Exceção?? Schedule.scheduleatfixedrate (new socketschedule (), 10, constantValue.time_out, timeUnit.Seconds); while (true) {pool.execute (new SocketDispatcher (server.accept ())); Loggerutil.info ("Aceite um cliente em" + new Date ()); }} catch (ioexception e) {pool.shutdown (); }} public static void main (string [] args) {try {new server (). start (); } catch (ioexception e) {loggerutil.error ("Start do servidor falhou! ->" + e.getMessage (), e); }}} Portal do cliente:
pacote yaolin.chat.client; importar java.io.ioexception; importar javax.swing.JOptionPane; importar yaolin.chat.client.callback.defaultCallback; importar yaolin.chat.client.view.Router; import yoolin.chat.client.imliVey.implientL.implieT.InplieT.InplieT.InplieT.Argister. */public class niloaychat {public static void main (string [] args) {RegisterAndLoginView v = (RegisterLoginView) Router.getView (RegisterLoginView.class) .create (); tente {v.display (); Cliente cliente = novo cliente (new defaultCallback ()); client.start (); Clientholder.setClient (cliente); } catch (ioexception e) {JoptionPane.showMessagedialog (v.getContentPane (), e.getMessage ()); }}} Download do código -fonte: demonstração
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.