Use a tecnologia de soquete para implementar a sala de bate -papo on -line e as funções de bate -papo privadas, o conteúdo específico é o seguinte
Sem mais delongas, vamos tirar a foto:
1. Página de bate -papo em grupo da sala de bate -papo
Lista de contatos para usuários online
Página de conexão com soquete
Página de bate -papo privado
Introdução ao projeto
Implemente a conexão de soquete com o servidor: quando cada cliente se conectar ao servidor, o servidor salvará cada soquete conectado na coleção de listas.
Função de bate -papo em grupo: Quando um usuário envia uma mensagem de bate -papo em grupo para o servidor, o servidor encaminha todas as informações para todos os clientes conectados na lista de lista.
Função de bate -papo privado: Depois que o usuário envia informações de bate -papo privado para o servidor, o servidor enviará uma mensagem para um IP de destino.
Exiba a lista de contatos on -line: quando um novo usuário efetuar login com sucesso, o servidor enviará as informações de contato on -line para o cliente na forma de uma string json e o cliente obtém as informações de contato on -line analisando a sequência JSON.
Personalize uma poderosa classe Socketevent: o cliente se comunica com o servidor e salva dados através desta classe e use a ferramenta Fastjson para converter o objeto de classe em uma string json para transmissão.
classe pública Socketevent {private int type = 0; String privada msg = ""; private string keyip = ""; // chave IP Private String temporaryip = ""; // IP temporário Public Socketevent () {} public int getType () {return type; } public void setType (int tipo) {this.type = type; } public string getMsg () {return msg; } public void setmsg (string msg) {this.msg = msg; } public string getKeyip () {return keyip; } public void setKeyip (string keyip) {this.Keyip = keyip; } public string getTemporaryip () {return temporaryip; } public void SettemporaryIP (String temporaryip) {this.TemporyIPT = TemporaryIP; }}TIPO: Assine que tipo de informação é enviada atualmente. Os dados de análise de servidor e cliente são usados para determinar a que tipo de mensagem pertence.
public static final int chat_private = 111; // Instruções para chat privado public static final int chat_group = 222; // Instruções para o bate -papo em grupo Public static final int soket_success = 333; // Instrução para conexão de soquete bem -sucedida public static final int soket_fail = 444; // Instrução para falha na conexão de soquete public static final int connect_success = 666; // instrução para conexão de soquete bem -sucedida public static final int connect_fail = 777; // O comando para conexão de soquete falhou public static final int login_arg = 888; // O soquete recebe o comando para assinar o login do novo usuário public static final int cancel_arg = 999; // O comando para assinar o login do usuário public static final int new_client = 3332; // o comando para assinar o login do novo usuário public static final int all_client = 3432; // O comando para assinar o login de todos os usuários on -line public static final int send_private = 5666; // o comando para enviar mensagens de bate -papo privado public static final int send_iplist = 6666; // Instruções para enviar a coleção IP do usuário conectado
keyip: endereço IP do iniciador de mensagens do cliente
Temperatura: endereço IP temporário. Se for um tipo que é um tipo de bate -papo privado, este IP representa o endereço IP do contato de destino.
ServerSocket
1. Receba conexão do cliente
Socket SocketClient = server.accept ();
2. Ligue o tópico para receber informações do cliente em tempo real
// Obtenha os dados enviados pelo cliente em tempo real @Override public void run () {try {while (true) {if ((aceitline = in.readline ())! = Null) {System.out.println ("<a mensagem recebida é>" + aceitline); Evento de Socketevent = JSON.ParseObject (AcepLine, Socketevent.class); switch (event.getType ()) {case utilfactory.chat_group: sendmsgavoid (event.getKeyip (), aceitline); quebrar; case utilfactory.send_private: event.setType (utilfactory.chat_private); sendmsgtarget (event.getTemporaryip (), json.tojSonstring (event)); quebrar; }}}} catch (Exceção e) {e.printStackTrace (); }}
3. Métodos para enviar mensagens para IPS e métodos especificados para enviar mensagens para todos os outros IPs, exceto o seu próprio IPS.
// Envie uma mensagem para o endereço IP especificado privado void sendmsgtarget (string Targetip, string msg) {int num = mlist.size (); for (int index = 0; index <num; index ++) {soket msocket = mlist.get (index); String ip = msocket.getineTAddress (). Gethostaddress (); if (ip.equals (Targetip)) {printWriter Pout = null; tente {Pout = new PrintWriter (new BufferWriter (novo outputStreamWriter (msocket.getoutputStream (), "utf-8")), true); Pout.println (msg); // Método de saída retorno; } catch (ioexception e) {e.printStackTrace (); }}}}} // Envie o void privado sendmsgavoid (string evite, string msString) {int num = mlist.size (); for (int index = 0; index <num; index ++) {soket msocket = mlist.get (index); String ip = msocket.getineTAddress (). Gethostaddress (); if (! ip.equals (evite)) {printWriter Pout = null; tente {Pout = new PrintWriter (new BufferWriter (novo outputStreamWriter (msocket.getoutputStream (), "utf-8")), true); Pout.println (msString); } catch (ioexception e) {e.printStackTrace (); }}}}O cliente aceita todas as informações do servidor no MainActivity, reembalagens de acordo com o tipo e usa o EventBus para enviar as informações para cada fragmento para exibição.
@SubScribe (ThreadMode = ThreadMode.Main) public void privatechat (Evento de Socketevent) {switch (event.gettype ()) {case myapplication.chat_private: // post a mensagem na sala de bate -papo private chatmessagebean bean = chatmessageBean (); bean.setmsg (event.getmsg ()); bean.setName (event.getKeyip ()); bean.setType (chatmessageBean.others_arg); Eventbus.getDefault (). Post (Bean); quebrar; case myApplication.send_private: sendmsg (json.tojSonstring (evento)); quebrar; }}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.