Código de backgammon Java con explicación detallada
Paquete de chat;
Importar Java. awt. borderlayout;
Importar Java. diseño de flujo;
Importar evento de acción Java .
Importar evento de acción Java . . evento de ventana;
Importar Java .io .lector almacenado en búfer;
Importar Java .io excepción;
Importar Java io . p>
p>
Importar Java .io .printstream;
Importar Java net .inet dirección;
Importar Java net .
Importar Java .util .string tokenizer
Importar javax . swing . jframe;
Importar javax.swing.jlabel;
Importar javax.swing.jpanel;
Importar javax.swing.jscrollpane;
Importar javax.jtextarea;
Importar javax.jtextfield;
Importar javax. ui manager;
Importar javax . swing border .
/**
*Programa cliente de sala de chat, interfaz GUI.
*/
La clase pública ChatClient extiende JFrame para implementar ActionListener{
//Etiqueta de nombre y cuadro de entrada para iniciar sesión en la sala de chat
JLabel nombre etiqueta = new JLabel();
JTextField nombre campo de texto = new JTextField(15);
//Botones de conexión y desconexión
JButton botón de conexión = nuevo JButton();
Botón de desconexión de JButton = nuevo JButton();
//Campo de texto para el contenido de la sala de chat
JTextArea chatContentTextArea = nuevo JTextArea(9 , 30);
//Botón envía mensaje
JButton sendMsgButton = new JButton();
//Cuadro de entrada de mensaje
JTextField msgTextField = new JTextField(20);
JLabel msg label = new JLabel();
//Lista de usuarios de la sala de chat
Java. awt . list people list = new Java . awt list(10);
/*El flujo de datos y las variables de red se definen a continuación*/
Socket soc = null
PrintStream ps = null
//El hilo en el que el cliente escucha los mensajes del servidor
ClentListener oyente = null
Cliente de chat público() {
init();
}
//Inicializa la interfaz gráfica
public void init() {
This.setTitle("Cliente de sala de chat");
//Inicializar botones y etiquetas
nombre etiqueta settext(" nombre:");
botón de conexión . settext(" conectar ");
botón de conexión .
botón de desconexión . >botón de desconexión. addactionlistener(this);
//Configura el contenido del chat para que no sea editable.
chatcontenttextarea . set editable(false);
sendmsgbutton . settext(" enviar ");
sendmsgbutton . p>MsgTextField.setText("Ingrese la información del chat");
//El Panel1 coloca el nombre de entrada y los botones de conexión.
Panel JPanel 1 = nuevo JPanel();
panel 1. establecer diseño (nuevo diseño de flujo());
panel 1. );
panel 1. agregar(nombre del campo de texto);
panel 1. agregar(botón de conexión);
panel1.add(botón de desconexión); /p>
//Se utiliza para colocar la visualización de información del chat y la lista de personas del chat.
Panel JPanel 2 = nuevo JPanel();
panel 2. establecer diseño(nuevo diseño de flujo());
Panel JScrollPane 1 = nuevo JScrollPane( chatContentTextArea);
panel 1. set border(new title dborder(border factory. createetchedborder(
Color. White, new color (134, 134, 134)), "Contenido del chat ");
panel 2. agregar(panel 1);
panel JScrollPane 2 = nuevo JScrollPane(lista de personas);
panel 2. establecer borde( nuevo título dborder(border factory . createetchedborder(
Color. blanco, nuevo color(134, 134, 134)), "lista de usuarios");
panel 2 . 2);
//Se utiliza para colocar el área para enviar información.
JPanel panel 3 = new JPanel();
panel 3. establecer diseño(. nuevo). diseño de flujo());
panel 3. agregar(etiqueta de mensaje);
panel 3. agregar(msgTextField);
panel 3. add(sendMsgButton);
//Agregar componentes a la interfaz
this.getContentPane() set layout(new BorderLayout());
this. getContentPane(). add(panel1, BorderLayout. Norte);
this.getContentPane(). add(panel2, BorderLayout.center);
this.getContentPane().
Sur);
this . pack();
Prueba {
ui manager . setlookandfeel(ui manager . getsystemlookandfeelclassname()); p>utilidades de swing . updatecomponentreui(this);
} catch(excepción e) {
e . p>}
/**
*Cerrar evento de cliente de sala de chat
*/
Proceso anulado protegidoWindowEvent(evento de ventana e) {
super . Processwindowevent(e);
if (e.getID() == WindowEvent. window_close){
// Si el cliente de la sala de chat está cerrado, desconéctelo.
desconectar();
disponer();
salir(0); >}
/**
*Manejar eventos de botón
*/
acción de anulación pública realizada (evento de evento de acción){
object source = event . getsource();
if (source == connectButton){
//Si haces clic en el botón "Conectar", p >
if (soc == null) {
Intenta {
// Crea una instancia de un socket local usando el puerto 2525.
SOC = new Socket(inet address . getlocalhost(), constante. SERVER _ PORT
//Imprime los resultados de la creación de instancias en la consola.
system . out . println(SOC);
//Apunta ps al flujo de salida del soc.
PS = new print stream(SOC . get output stream());
//Defina un búfer de caracteres para almacenar la información de envío.
información del búfer de cadena = nuevo búfer de cadena (const. CONNECT_IDENTIFER). Append(const.SEPERATOR);
//donde INFO es la palabra clave reconocida por el servidor como información de conexión.
//Y use ":" para separar el nombre y la IP, el servidor usará uno.
//La clase StringTokenizer lee datos.
cadena información de usuario = nombre campo de texto gettext()+constante. Separador
+ InetAddress.getLocalHost(). getHostAddress();
PS . println(info . append(userinfo));
PS .
//Crea una instancia del hilo del cliente y inícielo
listener = new ClentListener(this, nameTextField.getText(), SOC
listener.start());
} catch (IOException e) {
System.out.println("Error: "+e);
desconectar();
}
}
} else if(source = = botón de desconexión){
//Si haces clic en el botón de desconexión,
desconectar();
} else if(source == sendMsgButton){
//Si haces clic en el botón "Enviar",
if (soc! = null) {
//Defina y cree una instancia de un búfer de caracteres para almacenar la información del chat enviada.
msg de búfer de cadena = nuevo búfer de cadena (const. message_identifier). Append(const.SEPERATOR);
//Enviar información del chat mediante flujo de impresión.
PS . println(msg . append(msgtextfield . gettext()));
PS . >}
}
/**
*Desconectarse del servidor
*/
Vacío público desconectar(){
If (soc!= null) {
Intenta {
//Usar flujo de impresión para enviar información de salida para notificar al servidor de la desconexión Esta comunicación.
ps.println(const. QUIT_IDENTIFER);
PS .flush();
SOC .close(); //Cerrar el socket
escucha . tostop();
soc = null
} catch (IOException e) {
System.out.println( "Error: "+e);
}
}
}
Public static void main(String[] args){
cliente de chat = nuevo cliente de chat();
cliente establecido
}
/**
*La clase de subproceso del cliente se utiliza para monitorear la información del servidor.
*/
Clase ClentListener extiende el hilo {
//Guarde la información del nombre después de que el cliente se conecte.
String name = null
//El cliente acepta el flujo de entrada de datos del servidor.
BufferedReader br = null
//Implementar el flujo de impresión para enviar datos desde el cliente al servidor.
PrintStream ps = null
//Almacena la información del socket del cliente.
Socket socket = null
//Almacenar la instancia ChatClient actualmente en ejecución.
ChatClient parent = null
Operación booleana = true;
//Método de construcción
Escucha de cliente público (cliente de chat p, cadena n, socket s) {
//Aceptar parámetros
parent = p;
nombre = n;
socket = s;
Pruebe {
//crear una instancia de dos flujos de datos
br = new BufferedReader(new InputStreamReader
.getInputStream()));
PS = nuevo flujo de impresión(s. obtener flujo de salida());
} catch (IOException e) {
System.out.println(" Error:"+e);
parent .connect();
}
}
//Dejar de escuchar
public void toStop(){
this.running = false
}
//Método de ejecución del subproceso
Público void run(){
String msg = null
(Mientras se ejecuta){
msg = null p>
Pruebe {
//Leer información del servidor
msg = br . readline();
System.out.println(" Recibir mensaje: "+msg); p>
} catch (IOException e) {
System.out.println("Error: "+e);
parent .disconnect();
}
//Si la información del servidor está vacía, desconecte esta conexión.
if (msg == null) {
parent.listener = null
parent.soc = null
lista de personas principales. .remove all();
Running=false;
Return;
}
//Usa la clase StringTokenizer para leer caracteres de segmentos .
string tokenizer ST = new string tokenizer(msg, constante.SEPERATOR);
//Leer el encabezado del mensaje, es decir, la palabra clave, para identificar qué tipo de información es .
Palabra clave de cadena = ST . nexttoken();
if (keyword.equals(constant.PEOPLE_identifier)){
//Si es una persona, que es la información de conexión del cliente enviada por el servidor.
//Se utiliza principalmente para actualizar la lista de usuarios del cliente.
lista de personas principal. eliminar todos();
//Recorra st para obtener los clientes conectados actualmente.
mientras (st.hasMoreTokens()) {
cadena str = ST . nexttoken();
lista de personas . /p>
}
} else if (palabra clave.equals(constant.
MSG_IDENTIFER)) {
//Si la palabra clave es MSG, es el mensaje de chat enviado por el servidor.
//Se utiliza principalmente para actualizar el área de información del chat del cliente y mostrar el contenido del chat de cada cliente.
string usr = ST . nexttoken();
parent . chatcontenttextarea append(usr);
parent . \ 0 ");
parent . chatcontenttextarea . append(" \ r \ n ");
} else if (keyword.equals(constant.QUIT_IDENTIFER)) {
//Si la palabra clave es SALIR, significa que el servidor está cerrado.
sistema . out . println(" Salir ");
intenta {
ejecutar = false
parent.listener = null;
parent . SOC . close();
parent.soc = null
} captura (IOException e) {
System. out.println("Error: "+e);
}Finalmente {
parent.soc = null
lista de personas principal. ;
}
Romper;
}
}
//Borrar lista de usuarios
lista de personas principales . eliminar todo();
}
}
}
Paquete de chat;
Importar Java .awt .borderlayout;
Importar Java .color;
Importar evento de acción Java . Java . evento de ventana .
Importar Java . .io .io excepción;
Importar Java . /p>
Importar Java .net .socket
Importar Java util . javax .swing .fábrica de bordes
Importar javax . /p>
Importar javax.swing.jmenubar;
Importar javax.swing.jmenuitem;
Importar javax.swing.jpanel;
Importar javax . swing . jscrollpane
Importar javax .swing Utilidades
Importar javax .ui manager; border;
/**
*Programa del lado del servidor de la sala de chat, interfaz GUI
*/
La clase pública ChatServer extiende JFrame {
//Etiqueta de la barra de estado
Barra de estado estática de JLabel = new JLabel();
//Muestra la lista de información de conexión del cliente.
Java estático. awt. list connectInfoList = new Java.
//Guardar el hilo del procesador que actualmente procesa la solicitud del cliente.
Cliente vectorial estáticoProcesadores = nuevo vector (10);
//Número de conexiones actuales
static int active connects = 0;
//Método de construcción
Servidor de chat público(){
init();
Prueba {
//Establecer la interfaz a La apariencia predeterminada del sistema.
administrador de interfaz de usuario . setlookandfeel(administrador de interfaz de usuario . getsystemlookandfeelclassname());
utilidades de swing updatecomponentreeui(this); /p>
e .printstacktrace();
}
}
Private void init(){
Esto. setTitle("Servidor de sala de chat");
barra de estado . settext(" ");
//Inicializar menú
Menú de archivo JMenu = nuevo JMenu( );
menú de archivo . settext(" archivo ");
JMenuItem salir del elemento de menú = new JMenuItem()
salir del elemento de menú . );
salir del elemento del menú. addactionlistener(new action listener(){
acción de anulación pública realizada (evento de acción e){
salir de la acción realizada (e);
}
});
menú archivo . add(salir del elemento del menú);
JMenuBar menuBar = new JMenuBar();
menuBar.add(menú de archivo);
este setjmenubar(menuBar);
//Componente de diseño.
JPanel JPanel 1 = nuevo JPanel();
jpanel 1. establecer diseño(nuevo BorderLayout());
Panel JScrollPane = nuevo JScrollPane(connectInfoList) ;
pane . set border(new title dborder(border factory . createetchedborder(
Color. Blanco, nuevo color (134, 134, 134)), "Información de conexión del cliente") ;
jPanel1.add(new JScrollPane(pane), BorderLayout.center);
this.getContentPane().
this.getContentPane().add (barra de estado, diseño de borde.
Sur);
this.getContentPane(). add(jPanel1, BorderLayout. center);
este paquete();
}
/**
*Salir del menú. evento de elemento
* @param e
*/
acción de salida nula pública realizada (evento de acción e){
//Al cliente El final envía información de desconexión.
sendMsgToClients(new StringBuffer(const. QUIT_IDENTIFER));
//Cerrar todas las conexiones.
cerrar todo();
sistema .salir(0
}
/**
*Manejar eventos de cierre de ventana
*/
ProcessWindowEvent anulado protegido(evento de ventana e){
super .processwindowevent(e);
<. p>if (e.getID() == WindowEvent.Window_Close){exitActionPerformed(null);
}
} p>
/**
* Actualice la sala de chat, actualice continuamente los procesadores del cliente y cree la lista de usuarios más reciente.
*/
public static void notifyroompeopeople(){
búfer de cadena personas = nuevo búfer de cadena(constant. people_identifier);
for(int I = 0;i<procesadores cliente . tamaño();i++) {
procesador cliente c =(procesador cliente)procesadores cliente .elemento en(I);
personas. agregar (separador constante). append(c . nombre del cliente);
}
//Utilice el método sendClients para enviar información de la lista de usuarios al cliente.
sendMsgToClients(persona);
}
/**
* Enviar un mensaje grupal a todos los clientes.
* @param msg
*/
Sincronización estática pública void sendMsgToClients(string buffer msg){
for(int I = 0; i<procesadores del cliente . tamaño(); i++) {
procesador del cliente c =(procesador del cliente)elemento del cliente en(I);
System.out.println (" Enviar mensaje:"+msg);
c.send(message);
}
}
/** p>
*Cerrar todas las conexiones.
*/
public static void closeAll(){
while(procesadores cliente . tamaño()> 0) {
procesador del cliente c = (procesador del cliente) procesadores del cliente. primer elemento();
Intente {
//Cierre la conexión del socket y el hilo de procesamiento.
c . socket . close();
c . tostop();
} captura (IOException e) {
Sistema .out.println("Error: "+e);
}Finalmente {
procesadores de cliente eliminan el elemento(c);
}
}
}
/**
* Determinar si el cliente es legítimo.
*No permitir que el mismo cliente inicie sesión repetidamente. El llamado mismo cliente hace referencia a la misma IP y al mismo nombre.
* @param newclient
* @return
*/
Cliente de verificación booleana estática pública (ClientProcessor newclient){ p >
if(procesadores de cliente. contiene(nuevo cliente)){
Devuelve falso
} En caso contrario {
Devuelve verdadero
}
}
/**
*Desconéctalo y elimínalo de la lista de conexiones.
* @param client
*/
Desconexión de vacío estático público (cliente ClientProcessor) {
Desconectar (cliente, verdadero);
}
/**
* Desconecte una conexión y decida si desea eliminarla de la lista de conexiones a pedido.
* @param client
* @param toRemoveFromList
*/
Desconexión nula de sincronización estática pública (cliente ClientProcessor, booleano toRemoveFromList) {
Probar{
//Muestra información de desconexión en el cuadro de lista del programa del lado del servidor.
connectinfolist . add(client . clientip+" desconectar ");
chatserver active connects- //Reducir el número de conexiones en 1.
String constr = "Actualmente hay"+ChatServer.activeConnects+"El cliente está conectado";
barra de estado settext(const);
//Para. El cliente envía un mensaje de desconexión.
client.send(new StringBuffer(const. QUIT_IDENTIFER));
client . close()
} catch (IOException e ) {
System.out.println("Error: "+e);
}Finalmente {
//Eliminar la información del cliente de la matriz de clientes Información de socket relevante y detener el hilo.
if (toRemoveFromList) {
clientProcessors.removeElement(cliente);
cliente tostop();
}
p>
}
}
Public static void main(String[] args) {
ChatServer ChatServer 1 = nuevo ChatServer( );
p>
chatserver 1. set visible(true);
System.out.println("El servidor se está iniciando...");
ServerSocket server = null
p>
Try{
//El servidor comienza a escuchar.
servidor = new ServerSocket(const. SERVER _ PORT);
} catch (IOException e) {
System.out.println("Error:" +e);
system . exit(1);
}
while (true) {
//Si el actual cliente Si el número de clientes es menor que MAX_CLIENT, se acepta la solicitud de conexión.
if(procesadores cliente. tamaño()& lt; constante. MAX_CLIENT) {
Socket socket = null
Prueba {
//Recibir solicitud del cliente.
socket = servidor . aceptar();
if (socket != null) {
sistema fuera . /p>
}
} captura (IOException e) {
System.out.println("Error:"+e);
}
//Defina y cree una instancia de la clase de subproceso ClientProcessor para procesar mensajes del cliente.
procesador cliente c = nuevo procesador cliente(socket);
if (checkClient(c)) {
//Agregar a la lista
procesadores del cliente. add element(c);
//Si el cliente es legal, continúa.
int connum = ++ chatserver active connects;
//Muestra el número de conexiones en la barra de estado.
String constr = "Actualmente hay conexiones de clientes "+connum+";
chatserver . settext(constr); La información del socket del cliente se escribe en el cuadro de lista.
chatserver . connectinfolist . add(c . clientip+" conexión ");
c .
//Notificar a todos los clientes que la lista de usuarios. ha sido el Cambio.
notificar a la gente de la sala();
}de lo contrario{
//Si el cliente es ilegal,
C.ps. ("No se permiten inicios de sesión repetidos");
Desconectar (c, false
}
} En caso contrario {
/ /Si se excede MAX_CLIENT, espere un tiempo antes de intentar aceptar la solicitud.
Prueba {
thread .sleep(200
} catch (InterruptedException e) {
}
}
}
}
}
/**
* Procesar los datos enviados por el cliente El hilo solicitante.
*/
Categoría Hilo de extensión ClientProcessor {
//Información del socket de almacenamiento para conectar clientes.
Socket;
//Almacena el nombre de la conexión del cliente.
String clientName
//Almacena la información IP del cliente.
Cadena clientIP
//Se utiliza para aceptar el flujo de datos enviado por el cliente.
BufferedReader br
//Se utiliza para implementar el flujo de impresión para enviar información al cliente.
PrintStream ps
boolean run=true;
/**
*Método de construcción
* @ param s
*/
Manejador de cliente público (socket) {
socket = s;
prueba {
//Inicializa iostream.
br = nuevo lector almacenado en búfer (new InputStreamReader(socket . getinputstream()));
PS = nuevo flujo de impresión (socket . get output stream());
//Leer la información recibida. El primer mensaje es el nombre del cliente y la información de IP.
string client info = br . readline();
//Lee la información y analiza el mensaje según el delimitador del mensaje.
string tokenizer stinfo = new string tokenizer(información del cliente, Constantes. SEPERATOR);
string head = stinfo .
if (head. equals(constant. CONNECT_IDENTIFER)){
if (stinfo.hasMoreTokens()){
//El segundo dato después de la palabra clave es la información del nombre del cliente.
nombre del cliente = stinfo . nexttoken();
}
if (stinfo.hasMoreTokens()){
//Clave El tercer dato después de la palabra es la información de IP del cliente.
clientIP = stinfo . nexttoken();
}
system out . >
p>
}
} captura (IOException e) {
System.out.println("Error: "+e);
}
}
/**
*Enviar mensaje al cliente
* @param msg
*/
envío vacío público (mensaje de búfer de cadena){
PS . println(msg);
}
//Método de ejecución del subproceso
Ejecución de vacío público(){
(Mientras se ejecuta){
Línea de cadena = null
Intenta {
//Lee el flujo de datos enviado por el cliente.
line = br . readline();
} catch (IOException e) {
system out . /p>
servidor de chat . desconectar(esto);
servidor de chat .
Regresar; //El cliente se ha ido.
if (línea == null){
chatserver .connect(this);
chatserver . ;
}
tokenizador de cadena ST = nuevo tokenizador de cadena (línea, constante. SEPERADOR);
Palabra clave de cadena = ST. nexttoken();
p>//Si la palabra clave es MSG, es el mensaje de chat enviado por el cliente.
if (keyword.equals(constant.MSG_IDENTIFER)){
mensaje del búfer de cadena = nuevo búfer de cadena (constant.message_identifier). append(const. SEPERADOR);
msg . append(nombre del cliente);
append(ST . nexttoken(" \ 0 ");
// Luego envía el mensaje de chat de un cliente a la barra de chat de cada cliente conectado
chatserver . sendmsgtoclients(msg);
} else if (keyword.quals(constant. QUIT_IDENTIFER). )) {
//Si la palabra clave es SALIR, es la información de desconexión enviada por el cliente
//El servidor se desconecta de este cliente. p>chatserver .connect(this);
//Continuar monitoreando la sala de chat y actualizando la lista de nombres de chat de otros clientes.
chatserver.notifyroomponent();
running=false;
}
}
} p>
p>
public void toStop(){
Running=false;
}
// Anula el método igual del Clase de objeto.
Booleano público es igual a (objeto objeto){
si (instancia de objeto del procesador cliente){
procesador cliente obj 1 =(procesador cliente)obj;
if(obj 1 . clientip . igual a (este . clientip)& amp;& amp
(obj 1 . nombre del cliente . igual a (este . nombre del cliente))){ p>
Devuelve verdadero
}
}
Devuelve falso
}
/ /Anular el método hashCode de la clase Object.
public int hashCode(){
return (this.clientIP + constante. SEPERATOR + this.clientName). hashCode();
}
}
Paquete de chat;
/**
*Definir chat Constantes utilizadas en programas de cámara.
*/
Constante de clase pública {
//Número de puerto del servidor
Int final estática pública SERVER_PORT = 2525
p>
Public static final int MAX_CLIENT = 10;
//El delimitador entre el identificador del mensaje y el cuerpo del mensaje
Public static final string Delimiter = ":";
//Identificador de la información del mensaje
Cadena final estática pública MSG _ IDENTIFER = " MSG
//Identificador de información de la lista de usuarios
Público cadena final estática PEOPLE _ IDENTIFER = " PERSONAS
//Identificador para la información de conexión al servidor
cadena final estática pública CONNECT _ IDENTIFER = " INFO ";
//Identificador de información de salida
Cadena final estática pública QUIT _ IDENTIFER = " QUIT ";
}