Fiquei bastante ocioso recentemente e tenho tido tempo para revisar algumas aplicações técnicas do Java.
Não tenho nada para fazer hoje. Com base no protocolo UDP, escrevi um programa de sala de bate -papo muito simples.
No meu trabalho atual, os soquetes raramente são usados, o que também é uma memória simples da programação de rede Java.
Vamos dar uma olhada no efeito:
Pode -se dizer que o efeito da implementação é muito, muito simples, mas você ainda pode simplesmente ver um princípio de implementação.
Os usuários da "sala de bate -papo 001", Xiaohong e Xiaolu conversaram entre si por algumas palavras, e Xiaohei da "sala de bate -papo 002" o ignorou e ficou sozinho.
Dê uma olhada na implementação do código:
1. Primeiro de tudo, a implementação do servidor de mensagens, a função é muito simples:
• registrar as informações do cliente (qual sala de bate -papo você inseriu, etc.);
• Construir objeto de soquete do protocolo UDP para aceitar mensagens enviadas por cada cliente;
• Analisar o conteúdo da mensagem e empurre as informações de bate -papo de volta a cada cliente na sala de bate -papo correspondente;
pacote com.tsr.s.simplechat.receive_server; importar java.io.ioException; importar java.net.datagRampacket; importar java.net.datagramsocket; import java.net.sockeTexception; import.util.arraylist; com.tsr.simplechat.bean.messageEntity; importar com.tsr.simplechat.client.chatclient; // Class de chat public class Server Classerver Extende thread {// O programa ocupa o número da porta private static final intt int = 10000; // A mensagem aceita objeto de soquete privado static datagramsocket server = null; // Objeto de dicionário (chave: ID da sala de bate -papo, valor: o conjunto de usuários dos clientes nesta sala de bate -papo); HashMap estático privado <String, ArrayList <Catclient>> grupos = novo hashmap <string, ArrayList <CHATCLIENT>> (); // construtor public ChatServer () {try {// A mensagem aceita a inicialização do construto do servidor de objeto de soquete = new Datagramsocket (porta); } catch (SockeTexception e) {e.printStackTrace (); }} // Registre um novo usuário de login na sala de chat public static void logingRoup (string groupID, chatclient client) {// Obtenha todos os usuários on -line da sala de bate -papo através da sala de bate -papo Arraylist <Catclient> clients = groupS.get.get (groupid); if (clients == null) {clients = new ArrayList <Patclient> (); } // Registre os usuários que entram na sala de bate -papo desta vez clientes.add (cliente); // Atualize informações de informações da sala de bate -papo. } // Receba mensagem @Override public void run () {while (true) {receiveMessage (); }} private void recebeMessage () {// udp packet byte [] buf = novo byte [1024]; Pacote datagrampacket = new DatagRampacket (BUF, buf.length); while (true) {tente {// aceite o packet server.receive (pacote); } catch (ioexception e) {// TODO GATO GENERADO AUTOMENTADO BLOCO E.PRINTSTACKTRACE (); } // Analise o pacote de dados e obtenha informações de string de informações de bate -papo conteúdo = new String (packet.getData (), 0, packet.getLength ()); // analisar dados JSON através do pacote de terceiros gson gson = new GSON (); MessageIntity Me = GSON.Fromjson (conteúdo, MessageIntity.class); // Analisar o conteúdo da mensagem e obter todos os usuários on -line da sala de bate -papo através da sala de bate -papo ArrayList <CHATCLIENT> clientes = groups.get (megetGroupId ()); // Pressione a mensagem recebida de volta a cada usuário da sala de bate -papo para (Chatclient Client: Clients) {client.pushbackMessage (ME); }}}}2. O programa do cliente ainda é muito simples:
• Defina simplamente a interface da sala de bate -papo do cliente.
• Construa a mensagem Enviar objeto de soquete.
• Obtenha o conteúdo da caixa de informações de bate -papo e envie -o para o servidor.
pacote com.tsr.simplechat.client; importar java.awt.button; importar java.awt.event; importar java.awt.frame; importar java.awt.textarea; importawt.awt.textfield; import.awt.event.windowadapter; java.io.ioException; importar java.net.datagRampacket; importar java.net.datagramsocket; importar java.net.inetaddress; importar java.net.SockEtexception; import java.net.net.NOWNONDENSCIENCECIONCIONCIONCIONCEMEXCETIONBETEXCECCETIVO; com.tsr.simplechat.receive_server.chatserver; // programa de cliente public classe chatclient estende o quadro {private estático final serialversionuid = 1L; // ID da sala de bate -papo Grupo Private String; // Nome de usuário do cliente private String clientName; // Mensagem do cliente enviando soquete de serviço privado datagramsocket msg_send; // porta de serviço private final int porta = 10000; // Endereço IP do servidor IP privado INTAddress; // Controle do cliente TextField tf = new TextField (20); Textarea ta = new textarea (); Botão envia = novo botão ("Send"); // CLIENTE CONSTRUTOR Public ChatClient (String GroupID, String clientName) {super ("sala de chat:" + groupID + "/" + clientName); this.clientName = clientName; this.GroupID = groupID; // defina o estilo da interface do cliente add ("norte", tf); add ("centro", ta); add ("sul", envie); SetSize (250, 250); mostrar(); // inicialize init () para servidores relacionados ao bate -papo; // monitor addWindowlistener (new windowAdapter () {public void WindowClosing (WindowEvent e) {// Feche a mensagem Enviando serviço msg_send.close (); // Fechar o programa do cliente Dispon (); System.exit (0);}}); } // inicialize private void init () {// Registre as informações atuais do usuário e da sala de bate -papo no servidor ChatServer.LogingRoup (GroupID, isso); tente {// inicialize a mensagem enviando objeto de soquete msg_send = new Datagramsocket (); // Especifique o servidor de mensagens, tente {ip = inetAddress.getByName ("127.0.0.1"); } catch (desconhecidohostException e) {System.out.println ("UnknownHosTexception .."); }} catch (Socketexception e) {System.out.println ("Exceção de conexão do soquete .."); }} // Mensagem enviando tempo escutando public boolean Action (evento EVT, objeto arg) {if (evt.target.equals (send)) {try {// obtenha conteúdo de conteúdo de entrada conteúdo = tf.getText (); // Enviar mensagem send_message (content); // caixa de bate -papo limpa tf.settext (null); } catch (exceção ioo) {System.out.print (ioe.getMessage ()); }} retornar true; } // Enviar mensagem private void send_message (string content) {// formato de mensagem (formato json) string message = messageFormat (content); // encapsula a mensagem no pacote udp byte [] buf = message.getBytes (); Pacote datagrampacket = new DatagRampacket (BUF, buf.length, ip, porta); tente {// envie a mensagem msg_send.send (pacote); } catch (ioexception e) {System.out.println ("Exceção de io .."); }} // Mensagem formating private string messageFormat (string content) {stringBuffer buffer = new StringBuffer (); buffer.append ("{/" groupId/":"). append ("/" "). append (groupId) .append ("/","); buffer.append ("/" nome de usuário/":/"). Append (clientName) .append ("/", "); buffer.append ("/"text/":/"). Append (Content) .append ("/"}"); retornar buffer.toString (); } // Obtenha as últimas notícias da sala de bate -papo atual do servidor (retorno de chamada ..) public void PushbackMessage (MessageIntity ME) {ta.append (me.getUsername () + ":" + me.getText ()); ta.append ("/n"); }} 3. Classe de entidade da mensagem <r /> é usada principalmente para encapsular mensagens em objetos, incluindo: ID da sala de bate -papo, apelido do remetente de mensagem e conteúdo da mensagem. Use o formato JSON para analisar.
pacote com.tsr.simplechat.bean; // entidade de mensagem public class MessageIntity {private string groupID; Nome de usuário privado de string; texto privado de string; public String getGroupId () {return groupID; } public void setGroupId (string groupId) {this.groupid = groupID; } public string getUserName () {return userName; } public void setUserName (string userName) {this.username = nome de usuário; } public string getText () {return text; } public void setText (text string) {this.text = text; }}4. Ok, é basicamente feito aqui e crie uma classe de teste.
• Ligue o servidor de mensagens.
• Abra três clientes, dois dos quais entram na "sala de bate -papo 001" e o outro entra na "sala de bate -papo 002".
importar com.tsr.simplechat.client.chatclient; import com.tsr.simplechat.receive_server.chatserver; public class Test {public static void main (string [] args) {chatserver r = new ChatServer (); r.start (); Chatclient c1 = novo chatclient ("001", "pequeno vermelho"); Chatclient c2 = novo chatclient ("001", "Little Green"); Chatclient c3 = new chatclient ("002", "Little Black"); }}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.