Red de conocimiento informático - Aprendizaje de programación - Código de backgammon Java con explicación detallada

Código de backgammon Java con explicación detallada

Un gran proyecto, tienes un programa de backgammon. Si eres bueno en eso, consulta este programa de sala de chat y te resultará más fácil escribir un juego para todos.

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",

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

Pruebe {

//Leer información del servidor

msg = br . readline();

System.out.println(" Recibir mensaje: "+msg);

} 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);

}

}

/**

* 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);

}

}

/**

*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){

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>

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))){

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 ";

}