Chatmulihilo

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 11

UNIVERSIDAD TECNICA DE MANABI

Carrera:

Tecnologías de la Información y Comunicación

Estudiante:

Anthoni Levi Calderon Angulo

Semestre:

2do Semestre

Docente:

Ing. JOSE MORAN

Materia:

Programación Orientada a Objetos

2024

https://drive.google.com/drive/folders/13XmFbKb8iR51Umc_1fcjpHWBHkxHspPO
Actividad #9. Desarrollo de una Aplicación de Chat Multihilo

Objetivo:

El objetivo de esta tarea es que los estudiantes apliquen los principios de interfaces

gráficas de usuario (GUIs) y aprendan sobre la introducción a los hilos en Java para

desarrollar una aplicación de chat multihilo.

Instrucciones:

Parte 1: Diseño de la Interfaz Gráfica de Usuario (GUI)

• Estudia los elementos de las interfaces gráficas de usuario (GUIs) en Java.

• Diseña una interfaz gráfica simple para una aplicación de chat que incluya elementos

como áreas de texto para mensajes, campos de entrada para escribir mensajes y botones

para enviarlos.

• Implementa el manejo de eventos y manejadores de eventos para capturar las

acciones del usuario, como enviar un mensaje.

Código:

package com.mycompany.tareachat;
import javax.swing.*; // Importa el paquete correcto para Swing
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Tareachat extends JFrame {


private final JTextArea messageArea; // Área de texto para mostrar mensajes
private final JTextField inputField; // Campo de texto para ingresar mensajes
private final JButton sendButton; // Botón para enviar mensajes

public Tareachat() {
// Configuración de la ventana principal
setTitle("Tareachat");
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());

// Crear el área de texto para mostrar mensajes


messageArea = new JTextArea();
messageArea.setEditable(false); // No editable por el usuario
JScrollPane scrollPane = new JScrollPane(messageArea); // Panel de desplazamiento para el área de
texto
add(scrollPane, BorderLayout.CENTER); // Añadir el panel de desplazamiento al centro
// Crear el panel de entrada
JPanel inputPanel = new JPanel();
inputPanel.setLayout(new BorderLayout()); // Layout de borde
inputField = new JTextField(); // Este es el campo para digitar el texto
sendButton = new JButton("Send"); // Este es el botón para enviar
inputPanel.add(inputField, BorderLayout.CENTER); // Añadir campo de texto al centro del panel
inputPanel.add(sendButton, BorderLayout.EAST); // Añadir botón al este o parte derecha del panel
add(inputPanel, BorderLayout.SOUTH); // Añadir el panel de entrada al sur o lado izquierdo

// Manejo de eventos
sendButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sendMessage(); // Enviar mensaje cuando se presiona el botón
}
});

inputField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sendMessage(); // Enviar mensaje cuando se presiona Enter en el campo de texto
}
});

// Hacer visible la ventana


setVisible(true);
}

private void sendMessage() {


String message = inputField.getText(); // Obtener el texto del campo de entrada
if (!message.trim().isEmpty()) { // Si el mensaje no está vacío
messageArea.append("You: " + message + "\n"); // Mostrar el mensaje en el área de texto
inputField.setText(""); // Limpiar el campo de texto
}
}

public static void main(String[] args) {


SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Tareachat(); // Crear y mostrar la aplicación de chat
}
});
}
}
Capturas Parte 1
Parte 2: Implementación de la Lógica de Negocio y Multihilo

• Aprende sobre hilos en Java y los estados y ciclo de vida de los hilos.

• Diseña la lógica de negocio de la aplicación de chat para manejar la conexión entre

clientes y el intercambio de mensajes.

• Implementa los hilos necesarios para permitir la comunicación simultánea entre

múltiples clientes en la aplicación de chat.

• Utiliza clases internas y anónimas según sea necesario para estructurar tu código de

manera eficiente.

La lógica de negocio para una aplicación de chat debe manejar 3 aspectos importantes:

 Conexiones de clientes.
 Recepción y envío de mensajes.
 Sincronización para evitar condiciones de carrera.

Código del cliente del programa chat

package tarea;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Cliente {


private static final String SERVER_ADDRESS = "localhost";
private static final int SERVER_PORT = 12345;

private Socket socket;


private PrintWriter out;
private BufferedReader in;
private JTextArea messageArea;
private JTextField inputField;

public Cliente() {
// Configuración personal de la interfaz gráfica
JFrame frame = new JFrame("Chat de Cliente");
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
messageArea = new JTextArea();
messageArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(messageArea);
frame.add(scrollPane, BorderLayout.CENTER);

JPanel inputPanel = new JPanel();


inputPanel.setLayout(new BorderLayout());
inputField = new JTextField();
JButton sendButton = new JButton("Send");
inputPanel.add(inputField, BorderLayout.CENTER);
inputPanel.add(sendButton, BorderLayout.EAST);
frame.add(inputPanel, BorderLayout.SOUTH);

sendButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sendMessage();
}
});

inputField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sendMessage();
}
});

frame.setVisible(true);

// Conexión al servidor
try {
socket = new Socket(SERVER_ADDRESS, SERVER_PORT);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);

new Thread(new MessageReceiver()).start();


} catch (IOException e) {
e.printStackTrace();
}
}

private void sendMessage() {


String message = inputField.getText();
if (!message.trim().isEmpty()) {
out.println(message);
inputField.setText("");
}
}
private class MessageReceiver implements Runnable {
public void run() {
String message;
try {
while ((message = in.readLine()) != null) {
messageArea.append(message + "\n");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

public static void main(String[] args) {


SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Cliente();
}
});
}
}

Código del servidor del programa chat

package tarea;

import java.io.*;
import java.net.*;
import java.util.*;

public class Servidor {


private static final int PORT = 12345;
private static Set<ClientHandler> clientHandlers = new HashSet<>();

public static void main(String[] args) {


System.out.println("Chat server started...");

try (ServerSocket serverSocket = new ServerSocket(PORT)) {


while (true) {
Socket clientSocket = serverSocket.accept();
ClientHandler clientHandler = new ClientHandler(clientSocket);
clientHandlers.add(clientHandler);
clientHandler.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
static class ClientHandler extends Thread {
private Socket socket;
private PrintWriter out;
private BufferedReader in;

public ClientHandler(Socket socket) {


this.socket = socket;
}

public void run() {


try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);

String message;
while ((message = in.readLine()) != null) {
System.out.println("Received: " + message);
broadcastMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
clientHandlers.remove(this);
}
}

private void broadcastMessage(String message) {


synchronized (clientHandlers) {
for (ClientHandler clientHandler : clientHandlers) {
clientHandler.out.println(message);
}
}
}
}
}

Capturas parte 2
Parte 3: Integración de la Concurrencia GUI
• Investiga sobre la concurrencia GUI en aplicaciones de escritorio y cómo garantizar
la sincronización y el acceso seguro a los componentes de la interfaz gráfica.
• Implementa la integración de la concurrencia GUI en tu aplicación de chat para
garantizar que la interfaz de usuario se actualice de manera adecuada mientras los hilos
de comunicación están en ejecución.
}
}
}

Código cliente GUI

package tarea;
import javax.swing.*;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;

public class Cliente {


private static final String SERVER_ADDRESS = "localhost";
private static final int SERVER_PORT = 12345;

private Socket socket;


private PrintWriter out;
private BufferedReader in;
private JTextArea messageArea;
private JTextField inputField;

public Cliente() {
// Configuración de la interfaz gráfica
JFrame frame = new JFrame("Chat Client");
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());

messageArea = new JTextArea();


messageArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(messageArea);
frame.add(scrollPane, BorderLayout.CENTER);

JPanel inputPanel = new JPanel();


inputPanel.setLayout(new BorderLayout());
inputField = new JTextField();
JButton sendButton = new JButton("Send");
inputPanel.add(inputField, BorderLayout.CENTER);
inputPanel.add(sendButton, BorderLayout.EAST);
frame.add(inputPanel, BorderLayout.SOUTH);

sendButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sendMessage();
}
});

inputField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sendMessage();
}
});

frame.setVisible(true);

// Conexión al servidor
try {
socket = new Socket(SERVER_ADDRESS, SERVER_PORT);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);

new Thread(new MessageReceiver()).start();


} catch (IOException e) {
e.printStackTrace();
}
}

private void sendMessage() {


String message = inputField.getText();
if (!message.trim().isEmpty()) {
out.println(message);
inputField.setText("");
}
}

private class MessageReceiver implements Runnable {


public void run() {
String message;
try {
while ((message = in.readLine()) != null) {
// Asegurar que la actualización de la GUI se realiza en el EDT
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {

}
});
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

public static void main(String[] args) {


SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new ChatClient();
}
});
}
}
Captura parte 3

También podría gustarte