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
This browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
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
}
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.