Lectura relacionada: programación de la sala de chat de Socket Java (ii) Uso de Socket para implementar una sala de chat única
Ya hay muchos ejemplos de uso de enchufes para implementar el chat en Internet, pero he visto muchos de ellos, y hay más o menos problemas.
Aquí implementaré un ejemplo de chat relativamente completo y explicaré la lógica en él.
Dado que el zócalo es relativamente grande, dividiré algunos artículos para escribir un ejemplo de socket relativamente completo.
Aquí primero implementamos la función más simple de la comunicación del servidor-cliente y el cliente para realizar el mensaje de mensaje.
Propósito: el servidor establece una conexión con el cliente. El cliente puede enviar mensajes al servidor, y el servidor puede enviar mensajes al cliente.
1. Cree un servidor de chat de socket usando Java
1. Socketurls determina la dirección IP y el número de puerto
Public Class Socketurls {// Dirección IP Public Final Static String IP = "192.168.1.110"; // Port número Public final int Port = 8888;}2. La entrada al programa principal
Public Class Main {public static void main (string [] args) lanza la excepción {New ChatServer (). InitServer ();}}3. Clase de entidad de frijoles
UserInfobean
Public Class Main {public static void main (string [] args) lanza la excepción {New ChatServer (). InitServer ();}}Message de chatbean
public class MessageBean extiende UserInfobean {private Long MessageId; // Mensaje Idprivate Long GroupId; // Group Idprivate boolean isgoup; // Si se trata de un mensaje de grupo, private int chattype; // type de mensaje; 1, text; 2, imagen; 3, 4, 4, archivo; 5, ubicación geográfica; 6, voz de voz; 7, contenido de calificación privada de videos; // Contenido de mensaje de texto de texto de texto privado; ErrorCode; // código de error // omitir el método get/set}4. Servicio de chat de chatserver, el programa más importante
Public Class ChatServer {// Socket Service Private Static Serversocket Server; 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 (); Auto-generated catch blocke.printStackTrace();}}/*** Create message management and keep receiving messages*/private void createMessage() {try {System.out.println("waiting for user access: ");// Use accept() to block and wait for client requests Socket socket = server.accept();System.out.println("User access: " + socket.getPort());// Open a child thread to wait for another socket to join new Thread(new Runnable() {public void run() {createMessage();}}).start();// Send information to the client OutputStream output = socket.getOutputStream();// Get information from the client BufferedReader bff = new BufferedReader(new InputStreamReader (Socket.getInputStream ())); // Scanner Scanner = New Scanner (Socket.GetInputStream ()); New Thread (new Runnable () {public void run () {try {string buffer; while (true) {// Enter buffereder desde el console strin = new bufferedReader (new InputStreamReader (System.in); strin.readline (); // Porque Readline usa una nueva línea como punto final, agregue un búfer de NewLine al final += "/n"; blocke.printstackTrace ();}}}). start (); // lee la información del servidor enviado cadena line = null; // El bucle sigue recibiendo mensajes desde el cebo actual while (true) {thread.sleep (500); // system.out.println ("contenido:" + bff.readline (); // obtiene la información del cliente mientras ((línea (línea (línea (línea (línea (línea (línea (línea (línea (línea) {MessageBean MessageBean = Gson.FromJson (línea, MessageBean.Class); System.out.println ("User:" + MessageBean.getUsername ()); System.out.println ("Content:" + MessageBean.getContent ());}} // Server.Close ();} Catch (Exception E) {// a ToDD TatE blocke.printstacktrace (); system.out.println ("Error:" + E.getMessage ());}}}2. El lado de Android se usa como un lado móvil para conectarse al servidor
1. Aplicación instancia un servicio de chat global
Chatappliaction de clase pública extiende la aplicación {Public Static Chatserver Chatserver; Public Static UserInfobean UserInfobean; @OverridePublic Void onCreate () {super.oncreate ();}}2. La dirección IP y el número de puerto son consistentes con el servidor
3. La fuerza de chat es la misma que el lado del servidor
4. Diseño XML. Iniciar sesión, chatear
1. Iniciar sesión
<? xml versión = "1.0" encoding = "utf-8"?> <linealLayout xmlns: android = "http://schemas.android.com/apk/res/android" Android: Layout_width = "Match_parent" Android: Layout_height = "Match_pa alquiler "android: orientation =" vertical "> <edittextandroid: id ="@+id/chat_name_text "Android: Layout_width =" Match_parent "Android: Layou t_height = "wrap_content" android: hint = "username" android: text = "admin"/> <edittextandroid: id = "@+id/chat_pwd_text" android: lectout_width = " Match_parent "Android: LEING_HEight =" wrap_content "android: hint =" contraseña "android: text =" 123123123a "android: inputType =" NumberPassword " /> <ButtonAndroid: id = "@+id/chat_login_btn" android: loinout_width = "match_parent" android: Layout_height = "wrap_content" android: hint = "login"/> </linealLayout>
2. Chat
<? xml versión = "1.0" encoding = "utf-8"?> <linealLayout xmlns: android = "http://schemas.android.com/apk/res/android" xmlns: herramientas = "http://schemas.android.com/tools" Android: Layout_width = "Match_parent" android: Layout_height = "Match_Parent" Android: Orientation = = = = = = = = Herramientas "" verticales "" verticales ": context =". Activity.MainActivity "> <ScrollViewandroid: id ="@+id/scrollView "Android: Layout_width =" Match_Parent "Android: LEINT_HEight =" 0DP "Android: LayOut_weight =" 0.9 "> <LinElautandrandr oid: id = "@+id/chat_ly" android: lentout_width = "match_parent" android: layout_height = "match_parent" android: orientation = "vertical"> </linealLayout> </scrollView> <linealLayoutandroid: layOut_width = "Match_par Ent "Android: Layout_height =" wrap_content "Android: orientation =" horizontal "> <edittextandroid: id ="@+id/chat_et "android: loinout_width =" 0dp "Android: Layout_height =" Match_parent "android: Layout_weight =" 0.8 " /><ButtonAndroid:id="@+id/send_btn"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="0.2"android:text="send "/> </linearLayout> </lineAleLayout>
5. Loginactivity Iniciar sesión
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) {if (getLogin (chat_name_text.gettext (). ToString (). Trim (), chat_pwd_text.gettext (). ToString (). Trim ())) {getChatServer (); intento de intento = nuevo intent (loginactivity.this, this, this, this, this, MainActivity.class); startActivity (intent); final ();}}});} private boolean getLogin (name de cadena, cadena pwd) {if (textUtils.isEmpty (name) || textUtils.isEmpty (pwd)) return; if (name.equals ("admin") & y pwd.equals ("123123123123) falso;} private void getChatserver () {ChatAppliAction.ChatServer = new ChatServer ();}}6. Chat de MainActividad
public class MainActivity extends AppCompatActivity {private LinearLayout chat_ly;private TextView left_text, right_view;private EditText chat_et;private Button send_btn;private ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);@Overrideprotected void onCreate (Bundle SaveDInStancEstate) {super.onCreate (saveDInStanceState); setContentView (r.layout.activity_main); chat_ly = (linealLayout) findViewByid (r.id.chat_ly); chat_et = (editText) findViewByid (r.id.chat_et); send_btn = (button); findViewById (r.id.send_btn); send_btn.setOnClickListener (new View.OnClickListener () {@OverridePublic void onClick (Ver v) {ChatappliAction.chatserver.sendMessage (chat_et.gettext (). ToString (). Trim ()); chat_ly.addview (initrightView (chat_et.gettext (). ToString (). Trim ());}}); // agregar mensajes recibe queuechataPliAction.chatserver. {@OverridePublic Void HandLemessage (Mensaje msg) {if (msg.what == 1) {// Después de enviar el mensaje, actualizar uichat_ly.addview (initleftView (msg.obj.ToString ()));}}});}/** Mensaje a la derecha*@param MessageCont* @rethor messageContent) {right_view = new TextView (this); right_view.setLayoutParams (LayoutParams); right_view.setgravity (ver.focus_right); right_view.settext (messageContent); return_view; MessageContent) {Left_text = new TextView (this); Left_Text.SetLayoutParams (LayoutParams); Left_text.setGravity (View.focus_left); Left_text.setText (MessageContent); return_text;}}7. Lógica de chat de chatserver, la más importante
Public Class ChatServer {private Socket Socket; Private Handler Handler; Private MessageBean MessageBean; private gson gson = new Gson (); // Obtener la transmisión de salida del objeto Socket y construir el objeto PrintWriter PrintWriter; cola, utilizada para pasar mensajes ** @param Handler*/public void setchathandler (Handler Handler) {this.handler = Handler;} private void initchatserver () {// Abra el hilo para recibir mensajes por recibireMessage ();}/*** Inicializar la información del usuario*/private Void InitMessage () {MessageBean = nuevo nuevo MessageBean (); MessageBean.SetUserId (1); MessageBean.SetMessageId (1); MessageBean.SetchatType (1); MessageBean.SetUsername ("Admin"); ChatAppliAction.UserInfobean = MessageBean;}/*** Envíe un mensaje ** @param ContentMsg*/public void Sendmessage (String Content (string Content (prueba {prueba if (socket {socket {socket {socket (socket= (socket=. null) {mensaje mensaje = handler.obtainmessage (); message.what = 1; message.obj = "El servidor ha sido cerrado"; handler.sendMessage (mensaje); return;} byte [] str = contentMsg.getBytes ("utf-8"); // el contenido utf-8string aaa = new string (str); str); str); stetBeanContent (aaAtent; gson.tojson (MessageBean);/*** Debido a que 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"; output.writ.write(MessageJson.getBytes(etf- 8: Imprimir salida.flush (); // refresh the output stream so that the Server receives the string immediately} catch (Exception e) {e.printStackTrace();Log.e("test", "Error:" + e.toString());}}/*** Receive the message, in the child thread */private void receiveMessage() {new Thread(new Runnable() {@Overridepublic void run() {try {// Send a client Solicitar al puerto nativo 8080 socket = new Socket (Socketurls.ip, Socketurls.port); // Obtenga la secuencia de entrada del objeto Socket y construya el objeto BufferedReader correspondiente printwriter = newWriter (Socket.getOutputStream ()); input = Socket.getInputStream (); Outture = Socket.getutStreame DataOutputStream (Socket.getOutputStream ()); // Obtener información del cliente BufferedReader BFF = new BufferedReader (new InputStreamReader (input)); // Leer la línea de cadena de información del servidor enviada; línea); mensaje mensaje = handler.obtainmessage (); message.obj = line; message.what = 1; handler.sendMessage (mensaje);} if (socket == null) break;} output.close (); // Cerrar Socket Outtutson input.close (); // Cerrar la entrada de la entrada Stream.close (); // Close Socket} Catch (Exception Outture STREME.CLOSE (); // Cerrar el flujo de entrada Stream.close (); // Close Socket} Catch (Excepción EXTORT STREME) {E.PrintStackTrace (); log.e ("Test", "Error:" + E.ToString ());}}}). Start ();}}}Por cierto, todo el código se ha completado.
Esta demostración puede habilitar el teléfono móvil para enviar mensajes al servidor y al servidor al teléfono móvil.
Esta demostración puede considerarse como una función de empuje, pero el impulso real no es tan simple. Como principiante de los enchufes, puede ver las ideas de la programación de socket.
Lo anterior es la programación de la sala de chat de Socket Java presentada por el editor (1) para usar Socket para implementar el mensaje 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!