Use la tecnología Socket para implementar la sala de chat en línea y las funciones de chat privadas, el contenido específico es el siguiente
Sin más preámbulos, obtengamos la imagen:
1. Página de chat de grupo de sala de chat
Lista de contactos para usuarios en línea
página de conexión de socket
Página de chat privado
Introducción del proyecto
Implementar la conexión Socket con el servidor: cuando cada cliente se conecta al servidor, el servidor guardará cada socket conectado en la colección de la lista.
Función de chat de grupo: cuando un usuario envía un mensaje de chat grupal al servidor, el servidor reenvía toda la información a todos los clientes conectados en la lista de listas.
Función de chat privada: después de que el usuario envía información de chat privada al servidor, el servidor enviará un mensaje a una IP de destino.
Muestre la lista de contactos en línea: cuando un nuevo usuario inicia sesión correctamente, el servidor enviará la información de contacto en línea al cliente en forma de una cadena JSON, y el cliente obtiene la información de contacto en línea al analizar la cadena JSON.
Personalice una clase potente SocketEvent: el cliente se comunica con el servidor y guarda datos a través de esta clase, y luego use la herramienta FastJson para convertir el objeto de clase en una cadena JSON para la transmisión.
clase pública SocketEvent {private int type = 0; cadena privada msg = ""; String private keyIP = ""; // clave IP String private String temporalIP = ""; // Temporal IP public SocketEvent () {} public int getType () {Tipo de retorno; } public void settype (int type) {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 temporalip; } public void settemporaryip (string temporalip) {this.temporaryip = temporalip; }}Tipo: Firme qué tipo de información se envía actualmente. Los datos de análisis del servidor y el cliente se utilizan para determinar a qué tipo de mensaje pertenece.
public static final int chat_private = 111; // Instrucción para chat privado público estático final int chat_group = 222; // Instrucción para el chat grupal Public static final int Socket_success = 333; // Instrucción para una conexión de socket exitosa Public static final int Socket_fail = 444; // Instrucción para la conexión de socket fallida public static final int conection_success = 666; // Instrucción para una conexión de socket exitosa Public static final int conect_fail = 777; // El comando para la conexión de socket falló public static final int login_arg = 888; // El socket recibe el comando para firmar el inicio de sesión del nuevo usuario público estático final int cancel_arg = 999; // El comando para firmar el inicio de sesión del usuario público estático final int new_client = 3332; // El comando para firmar el inicio de sesión del nuevo usuario público estático final int all_client = 3432; // El comando para firmar el inicio de sesión de todos los usuarios en línea Public static final int send_private = 5666; // El comando para enviar mensajes de chat privados pública estática final int send_iplist = 6666; // Instrucción para enviar la colección IP de usuario iniciada
KeyIP: Dirección IP del Iniciador de mensajes del cliente
Temperatura: dirección IP temporal. Si es un tipo que es un tipo de chat privado, esta IP representa la dirección IP del contacto de destino.
Mínimo
1. Reciba la conexión del cliente
Socket SocketClient = Server.accept ();
2. Encienda el hilo para recibir información del cliente en tiempo real
// Obtenga los datos enviados por el cliente en tiempo real @Override public void run () {try {while (true) {if ((aceptación = in.readline ())! = Null) {system.out.println ("<El mensaje recibido es>" + aceptación); SocketEvent Event = json.parseObject (aceptación, socketeVent.class); switch (event.gettype ()) {case utilfactory.chat_group: sendmsgavoid (event.getKeyip (), aceptación); romper; Case UtilFactory.Send_Private: Event.Settype (UtilFactory.Chat_Private); sendmsgTarget (event.gettemporaryip (), json.tojsonstring (evento)); romper; }}}} Catch (Exception e) {E.PrintStackTrace (); }}
3. Métodos para enviar mensajes a IP y métodos especificados para enviar mensajes a todas las demás IP, excepto sus propios IP.
// Enviar un mensaje a la dirección IP especificada Void private SendmSgTarget (String TargetIP, String Msg) {int num = mlist.size (); for (int index = 0; index <num; index ++) {socket msocket = mlist.get (index); Cadena ip = msocket.getInetAddress (). Gethostaddress (); if (ip.equals (targetip)) {printWriter pout = null; Pruebe {POUT = new PrintWriter (new BufferedWriter (new OutputStreamWriter (msocket.getOutputStream (), "UTF-8")), true); POUT.PRINTLN (MSG); // retorno del método de salida; } catch (ioException e) {E.PrintStackTrace (); }}}}} // Envía privado void sendmsgavoid (string evitip, string msString) {int num = mlist.size (); for (int index = 0; index <num; index ++) {socket msocket = mlist.get (index); Cadena ip = msocket.getInetAddress (). Gethostaddress (); if (! ip.equals (evitip)) {printWriter pout = null; Pruebe {POUT = new PrintWriter (new BufferedWriter (new OutputStreamWriter (msocket.getOutputStream (), "UTF-8")), true); POUT.PRINTLN (MSSTRING); } catch (ioException e) {E.PrintStackTrace (); }}}}El cliente acepta toda la información del servidor en MainActivity, reempaquetado de acuerdo con el tipo y usa EventBus para enviar la información a cada fragmento para la visualización.
@SubScribe (ThreadMode = ThreadMode.Main) public void privateChat (SocketEvent Event) {switch (event.gettype ()) {case myApplication.chat_private: // publique el mensaje en la sala de chat privada chatmessagean bean = new chatmessagean (); bean.setmsg (event.getMsg ()); bean.setName (event.getKeyip ()); Bean.settype (chatMessageBean.others_arg); EventBus.getDefault (). Post (Bean); romper; case myApplication.send_private: sendmsg (json.tojsonstring (evento)); romper; }}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.