En el artículo anterior, la programación de la sala de chat de Java Socket (1) utilizando Socket para implementar los mensajes de chat Push, hablamos sobre cómo usar Socket para hacer que los mensajes pasen entre el servidor y el cliente para lograr el propósito de enviar mensajes. A continuación, escribiré sobre cómo habilitar el servidor para establecer la comunicación entre el cliente y el cliente.
De hecho, es establecer una comunicación de chat uno a uno.
Es algo diferente del código anterior que implementó el mensaje de mensajes, y se modificó en él.
Si no se mencionan los métodos o clases, son exactamente los mismos que en el artículo anterior.
1. Modifique la clase de entidad (la clase de entidad en el servidor y el cliente es el mismo)
1. Tabla de información del usuario de UserInfobean
clase pública userInfobean implementos serializables {private static final long serialversionUid = 2l; private long userId; // user Idprivate String String UserName; // Nombre de usuario String private String Commate;/ Appok String private String UserPwd; // Contraseña de usuario Cadena privada Usericon; // Avatar de usuario // omitir los métodos de configuración}2. Tabla de información de chat de MessageBean
Clase pública MessageBean implementos serializables {private static final long serialversionUid = 1l; private long messageId; // mensaje idprivate long groupid; // grupo idprivate boolean isgoup; // Si es un mensaje grupal intent private int chattype; // type de mensaje; 1, texto; 2, imagen; 3, breve video; 4, archivo; 5, geographicicsole; 6, stattype de voz; contenido privado cadena errorMSg; // Mensaje de error Private int ErrorCode; // Código de error Private int userId; // User Idprivate int FriendID; // Target IdPrivate Idprivate MessageFileBean ChatFile; // Adjunto de mensajes // omitir Get y establecer métodos}3. MessageFileBean Mensaje Adjunto
Clase pública MessageFileBean implementos serializables {private static final long SerialVersionUid = 3l; private int fileid; // file idprivate string filename; // nombre de archivo privado larga fileLenggth; // longitud de archivo byte privado [] fileByte; // archivo contenido string private string string type; // string string string string string filetitle; // nombre de archivo nombre // omit get get y set Métodos} Content String FileType; // File Tipo de cadena privada FileTitle; // Archivo Nombre del encabezado // omit Get Get y set Métodos Content String private FileType; // File Tipo de cadena privada Filetitle; // Archivo Nombre del encabezado de archivo2. (Modificación del código del lado del servidor) La principal clase de servicio de chat de Chatserver, modificada
Servicio de chatserver de clase pública {// Socket Service privado Servidor estático Servidor; // use ArrayList para almacenar todos los SocketPublic List <Socket> SocketList = new ArrayList <> (); // Imitando SocketPublic Map <Integer, Socket> SocketMap = New HashMap (); // Imité información guardada en el Mape Public Public Map <InteGer, usermap, UsMap = NewSermap (); Hashmap (); public gson gson = new gson ();/*** Inicializar el servicio Socket*/public void inItServer () {try {// Cree un Serversocket para escuchar las solicitudes de los clientes en el puerto 8080 Server = new ServerSocket (Socketurls.port); CreateMessage ();} Catch (IoException E) {// ado-Generated Catcherated Catcherated Catch blocke.printstackTrace ();}}/*** Crear administración de mensajes y seguir recibiendo mensajes*/private void createMessage () {try {system.out.println ("Esperando el acceso al usuario:"); // use Acepter () para bloquear la espera de las solicitudes de los clientes Socket = Server.accept (); // Guardar el volante vinculado a la colección de la colección a la colección de la colección a la colección a la colección de la colección en la colección de la colección en la colección de la colección en la colección de la colección en la colección de la colección en la colección. SocketList.Add (Socket); System.out.println ("Access de usuario:" + Socket.getPort ()); // Abra un hilo infantil para esperar a que otro Socket se una a New Thread (new Runnable () {public void run () {// crea un servicio de socket en espera de que otros usuarios accedan a acceder a CreatEsage ();}). Start (); // Obtenga información del cliente BufferedReader bff = new BufferedReader (new InputStreamReader (Socket.getInputStream ())); // Lea la información del servidor enviada String Line = null; // Looping para recibir mensajes de la actualidad actual (true) {Thread.seLep (500); // System.out.println ("Content:" + bff.ROCKELLINE (); // bff.readline ())! = null) {// analiza la clase de entidad MessageBean MessageBean = Gson.FromJson (Line, MessageBean.Class); // Agregar información del usuario al mapa, imitarla en la base de datos y la memoria // La clase de entidad se almacena en la dataBase y el recuerdo se almacena en la memoria. La identificación del usuario se utiliza como referencia setchatmap (messageBean, Socket); // reenvía el mensaje enviado por el usuario al amigo de destino getfriend (messageBean); system.out.println ("user:" + usermap.get (messageBean.getUserId ()). GetUsernerN server.close ();} catch (Exception e) {// tODO Auto Generated Catch Blocke.PrintStackTrace (); System.out.Println ("Error:" + E.getMessage ();}}/*** Enviar un mensaje*/private void getMessage () {new thread (new Runnable () {public Void Run () {Pruebe {Pruebe {TRAT {TRAT {TRAT {TRAT {TRAT (TRET (TRET (TRET (TRET (TREMA) (verdad) {// Ingrese a BufferedReader desde la consola strin = new BufferedReader (new InputStreamReader (System.in)); Buffer = Strin.Readline (); // porque Readline usa una nueva línea como el punto final, agregue un tampón de Newline al final += "/n"; // aquí se modifica a todos los usuarios con conectores conectados a Servidor para (Socket Socket Socketmap: Socketmap. = Socket.getOutputStream (); output.write (buffer.getBytes ("utf-8")); // Enviar datos de datos.flush ();}}} catch (ioException e) {// tODO Auto Generated Generated Catch BLOCKE.PrintStActace ();}}}). Start ();}/*** Simulated Simulated TACT BLOCKE. MessageBean* @param scoket*/private void setchatmap (MessageBean MessageBean, Socket scoket) {// Guarde la información del usuario if (usermap! = null && usermap.get (messageBean.getUserId ()) == null) {usermap.put (messageBean.getuserid (),,,,,,,,,,,, getUserInfobean (MessageBean.getUserId ()));} // Guardar el socket vinculado correspondiente if (SocketMap! = NULL && SocketMap.get (MessageBean.getUserId ()) == NULL) {SocketMap.put (MessageBean.getUserId (), sCOKET);}/*** Simulación de la información del usuario de la información del usuario de la información del usuario, Crear información del usuario con la información del tiempo, la información del usuario, la información de la información del usuario, la información del usuario, la información del usuario, la información de la información del usuario. aquí** @param userId* @return*/private userInfobean getUserInfobean (int userId) {userInfobean userInfobean = new UserInfobean (); userInfobean.setUsericon ("User Avatar "); userInfobean.setUserId (userId); userInfobean.setUsername (" admin "); userInfobean.setUserPWD (" 123123132a "); return userInfobean;}/*** reenviar el mensaje al amigo objetivo** @param MessageBean*/private void (MensajeBeanbean) && SocketMap.get (MessageBean.getFriendId ())! = NULL) {Socket Socket = SocketMap.get (MessageBean.getFriendId ()); String Buffer = Gson.ToJson (MessageBean); // Porque Readline es el punto final con una nueva línea, agregue un nuevo búfer de búfer en el end += "/n"; intente {// envíe el mensaje a la salida del cliente. Socket.getOutputStream (); output.Write (buffer.getBytes ("utf-8")); // Enviar datos de datos3. (Código del cliente) La modificación de la página de inicio de sesión de LoginActividad puede iniciar sesión en varias personas
La clase pública LoginActivity extiende AppCompatActivity {private editText chat_name_text, chat_pwd_text; privado botón chat_login_btn; @OverrideProtected void onCreate (bundle saveDInStancate) {super.oncreate (saveDInState); setContentView (r.layout.activity_lagin; (Edittext) findViewById (r.id.chat_name_text); chat_pwd_text = (edittext) findViewById (r.id.chat_pwd_text); chat_login_btn = (botón) findViewByid (r.id.chat_login_btn); chat_login_btn.setClicklistener (newewlickener.onCLICKENEDER {@OverridePublic void onClick (ver v) {int status = getLogin (chat_name_text.gettext (). ToString (). Trim (), chat_pwd_text.gettext (). ToString (). Trim ()); if (status == -1 || status == 0) Toast.length_long) .show (); return;} getChatserver (getLogin (chat_name_text.gettext (). ToString (). Trim (), chat_pwd_text.gettext (). ToString (). Trim ())); intento = intento nuevo (loginactivity.this, this, this, this, MainActivity.class); startActivity (intento); final ();}});}/*** Volver al estado de inicio de sesión, 1 es el usuario y 2 es el otro usuario. Aquí, dos usuarios están simulados para comunicarse entre sí ** @param nombre* @param pwd* @return*/private int getLogin (name de cadena, cadena pwd) {if (textUtils.isEmpty (name) || textUtils.isEmpty (pwd)) {return 0; // no contraseña completa} else if if (name.equals ("admin") && pwd.equals ("1;" 1)) 1; // user1} else if (name.equals ("admin") && pwd.equals ("2")) {return 2; // user2} else {return -1; // contraseña error}}/*** Instantiate un servicio de chat ** @param status*/private void getchatserver (int status) {chatapPliaction.chatserver = new chatserver (status);4. (Código del cliente) Modificación del código de servicio de chat de chatserver lógica
Public Class ChatServer {private Socket Socket; Handler de controlador privado; Message de MessageBean MessageBean; Private Gson gson = new Gson (); // Obtenga la transmisión de salida del objeto Socket y construya el objeto PrintWriter PrintWriter PrintWriter; InputStream Input; OutputStream OutputSoutPutStream OutputStream; Public Chatserver (int Status) {initMessage (status); initchatserver ();}/*** cola de mensajes, usado para pasar mensajes ** @param manejador*/public void setchathandler (manejador de controlador) {this.handler = handler;} private initchatserver () {// hilo abierto para recibir mensajes recibidos ();}/*** Inicinidad de usuario privado*/private void voidver () (estatus de hilo abierto) {MessageBean = new MessageBean (); UserInfobean userInfobean = new UserInfobean (); userInfobean.setUserId (2); messageBean.setMessageId (1); MessageBean.SetchatType (1); userInfobean.setUsername ("admin"); userInfobean.setUserPWD ("123123123A"); y el usuario de Target de chat IDIF (status == 1) {// Si es el usuario 1, entonces señala al usuario 2 para chat MessageBean.SetUserID (1); MessageBean.SetFriendidId (2);} else if (status == 2) {// Si es el usuario 2, entonces señalará el usuario 1 para chat MessageBean.setUserid (2); MessageBean.SetFriendId (1);} ChatAppliAction.UserInfobean = userInfobean;}/*** Enviar un mensaje ** @param ContentMsg*/public Void sendMessage (String ContentMsg) {try {if (Socket == NULL) {Message Message = Handler.OBTainMessage (); Mensaje.what = 1; Message.obj = " cerrado "; handler.sendMessage (mensaje); return;} byte [] str = contentMsg.getBytes (" utf-8 "); // Convertir el contenido a utf-8String aaa = new String (str); MessageBean.SetContent (AAA); String MessageJson = Gson.ToJson (MessageBean);/*** Porque la línea de lectura () en el servidor está bloqueando la lectura* Si no puede leer el carácter de Newline o la transmisión de salida finaliza, se bloqueará allí* por lo que se agrega un carácter de Newline al final del mensaje JSON para decirle al servidor que el mensaje se ha enviado***/Messagejson += = = = = = = = = = = = = = = = = = "/n";eutput.Write(MessageJson.getBytes("UTF-8")) ;// Imprima la salida de caracteres Newline.flush (); // Actualizar la transmisión de salida de modo que el servidor reciba la cadena inmediatamente} capt (excepción e) {e.printstackTrace (); log.e ("test", "error:" + e.ToString ());}}/*** Recibe el mensaje y en el hilo*/private void reciboMessage () {new runnable () {@@@@@@@@@@@@@@@@@@@@@SoverRideP run () {tree- {thinte {thyment request to the native port 8080 socket = new Socket(SocketUrls.IP, SocketUrls.PORT);// Get the input stream from the Socket object and construct the corresponding BufferedReader object printWriter = new PrintWriter(socket.getOutputStream());input = socket.getInputStream();output = socket.getOutputStream();dataOutputStream = new DatautputStream (Socket.getOutputStream ()); // Obtenga información del cliente BufferedReader BFF = new BufferedReader (new InputStreamReader (input)); // Leer la línea de cadena de información del servidor línea); MessageBean MessageBean = Gson.FromJson (Line, MessageBean.Class); Message Message = Handler.obtainMessage (); Message.obj = MessageBean.getContent (); Message.what = 1; Handler.SendMessage (Message);} if (Socket == null) break;} output.close (); // Close Socket stock stream (stream toping; Entrada Stream Socket.Close (); // Cerrar Socket} Catch (Exception E) {E.PrintStackTrace (); log.e ("Test", "Error:" + E.ToString ());}}}). Start ();} public Socket GetOCECEKT () {si (SOCKET == null) return null; return;}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}De esta manera, la lógica del código se ha modificado a partir de la lógica del mensaje de mensajes a la lógica del chat único.
Este código permite al usuario 1 y el usuario 2 chatear entre sí, y el servidor registrará el historial de chat entre ellos. Y el servidor también tiene la función del mensaje de mensaje.
Lo anterior es la programación de la sala de chat de Socket Java presentada por el editor (ii) usando Socket para implementar una sola sala de chat. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!