How to fix sockets problem

lmbdr 20 Reputation points
2023-03-27T15:19:46.0233333+00:00

In this code, i only can add one user to the server, why?


namespace Battleship_sockets
{
    #region CLASE JUGADOR
    public class Jugador
    {
        public string Nombre { get; set; }
        public List<string> ListaDeBarcos { get; set; }
        public string[,] Tablero { get; set; }
    }
    #endregion

    #region CLASE SERVIDOR
    public class Server
    {
        #region ATTRIBUTES
        private TcpListener tcpListener;

        // Lista de clientes conectados
        private List<TcpClient> clientes = new List<TcpClient>();

        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool AllocConsole();
        #endregion

        #region START
        public async Task Start()
        {
            AllocConsole(); // Agregar esta línea para crear una consola en modo Windows Forms
            try
            {
                // Crear el punto de conexión para escuchar
                IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
                IPEndPoint localEndPoint = new(ipAddress, 8080);

                // Crear el socket TCP para escuchar
                tcpListener = new(localEndPoint);

                // Iniciar la escucha del socket
                tcpListener.Start();

                Console.WriteLine("Servidor iniciado y escuchando en el puerto 8080...");

                while (true)
                {
                    TcpClient cliente = await tcpListener.AcceptTcpClientAsync();

                    // Iniciar un hilo para manejar la conexión del cliente
                    await Task.Run(() => HandleClient(cliente));
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
        #endregion

        #region HANDLE CLIENT
        private async Task HandleClient(TcpClient client)
        {
            await using NetworkStream stream = client.GetStream();

            try
            {
                #region 1
                // Agregar el cliente a la lista de clientes conectados
                clientes.Add(client);
                Console.WriteLine("Cliente añadido.");

                // Verificar si hay dos clientes conectados
                if (clientes.Count == 2)
                {
                    Console.WriteLine("Ambos clientes conectados.");
                }
                else
                {
                    Console.WriteLine("Esperando a que se conecte otro cliente...");
                    return; // Esperar a que se conecte otro cliente
                }
                // Leer mensajes del cliente
                byte[] buffer = new byte[1024];
                int bytesRead = await stream.ReadAsync(buffer);
                string message = Encoding.ASCII.GetString(buffer, 0, bytesRead);
                Console.WriteLine($"Mensaje recibido del cliente: {message}");

                // Responder
                string mensaje = "OK";
                byte[] buffer2 = Encoding.ASCII.GetBytes(mensaje);
                await stream.WriteAsync(buffer2);
                #endregion                
            }
            catch (Exception e)
            {
                Console.WriteLine($"Error en el cliente: {e.Message}");

                // Eliminar el cliente de la lista de clientes
                clientes.Remove(client);

                // Cerrar la conexión con el cliente
                client.Close();
            }
        }
        #endregion

        #region LISTO
        public void Listo(string user, TcpClient cliente)
        {
            try
            {

                if (clientes.Count != 2)
                {
                    Console.WriteLine("No hay otro cliente conectado.");
                    MessageBox.Show("No hay otros clientes conectados al servidor.",
                        "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                NetworkStream stream = cliente.GetStream();

                byte[] mensajeBytes = Encoding.ASCII.GetBytes(user + " está listo.");
                stream.Write(mensajeBytes, 0, mensajeBytes.Length);

                Console.WriteLine("Mensaje enviado al oponente.");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
        #endregion
    }
    #endregion
}
C#
C#
An object-oriented and type-safe programming language that has its roots in the C family of languages and includes support for component-oriented programming.
10,827 questions
{count} votes

Accepted answer
  1. Bruce (SqlWork.com) 63,916 Reputation points
    2023-03-27T15:52:47.3233333+00:00

    your code:

    while (true)
                    {
                        TcpClient cliente = await tcpListener.AcceptTcpClientAsync();
    
                        // Iniciar un hilo para manejar la conexión del cliente
                        await Task.Run(() => HandleClient(cliente));
                    }
    

    is only processing one client at a time. remove the await on handle client, and it will handle more than one.

    1 person found this answer helpful.

0 additional answers

Sort by: Most helpful

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.