Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Клиент не подключается к серверу.

e о Мастер (1195), на голосовании 4 месяца назад
Есть код: https://pastebin.com/Y2wpSVuA
Так как клиент не подключался я добавил дебаг, в итоге в консоль выводится только "Сервер запущен" "Wait to client... ". Что делать?
Голосование за лучший ответ
Татьяна Просветленный (36374) 5 месяцев назад
Проблема в том, что метод StartListen никогда не принимает подключения клиентов из-за неправильного использования метода Stop, который блокирует основной цикл ожидания клиентов. Ваш код также содержит логические ошибки, например, вызов Stop внутри цикла, где он не нужен.
 using System; 
using System.Net.Sockets;
using System.Threading.Tasks;
using System.Net;
using System.Collections.Generic;
using System.Text;

namespace Chat
{
public class Server
{
public async Task Main()
{
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2300);
TcpListener listener = new TcpListener(ep);
List clients = new List();
List streams = new List();
_ = Task.Run(() => Stop(listener)); // Запускаем Stop в отдельной задаче, чтобы не блокировать основной поток
await StartListen(listener, clients, streams);
await ProcessMessage(streams);
}

async Task Stop(TcpListener listener)
{
while (true)
{
string signal = Console.ReadLine();
if (signal == "1")
{
listener.Stop();
Console.WriteLine("Сервер остановлен");
break;
}
else
{
Console.WriteLine("Введите 1 для остановки сервера");
}
}
}

async Task StartListen(TcpListener tcplisten, List list, List streams)
{
tcplisten.Start();
Console.WriteLine("Сервер запущен");
while (true)
{
Console.WriteLine("Ожидание клиента...");
try
{
TcpClient newClient = await tcplisten.AcceptTcpClientAsync();
list.Add(newClient);
Console.WriteLine("Клиент добавлен");
NetworkStream clientStream = newClient.GetStream();
streams.Add(clientStream);
Console.WriteLine("Подключен новый клиент");
}
catch (SocketException)
{
Console.WriteLine("Слушатель остановлен");
break;
}
}
}

async Task ProcessMessage(List streams)
{
while (true)
{
foreach (var stream in streams)
{
if (stream.DataAvailable)
{
byte[] buffer = new byte[1024];
int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($"Получено сообщение: {message}");
byte[] response = Encoding.UTF8.GetBytes(message);
foreach (var otherStream in streams)
{
if (otherStream != stream)
{
await otherStream.WriteAsync(response, 0, response.Length);
}
}
}
}
await Task.Delay(500);
}
}
}
}
Похожие вопросы