Вечный сервер - C#
Формулировка задачи:
Доброго времени суток, нужно поставить прием новых пользователей в цикл(если в данный момент активного нет)
Пытаюсь не закрыть сервер - новых он не принимает .
Если закрыть и открыть сервак после отключения клиента - он ловит цикл и все равно нового не берет(можно поймать ошибку Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт) думал не успевает закрыться сервер - поставил ожидание, ждет и только после этого кричит ошибку).
Испробовал кучу других вариантов но результат один - второго коннекта добиться не смог.
Могу ошибаться но вроде есть параметр позволяющий подключаться к слушалке определенное кол-во раз, но инфы не нашел.
Последний catch и есть отключение клиента от сервера
Подскажите как реализовать нечто подобное в мейне, у самого пока не хватает знания языка
данный код выдает ошибку Cannot convert method group 'Close' to non-delegate type 'bool'. Did you intend to invoke the method?
using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using System.Threading; namespace tcpserver { class Program { static void Main(string[] args) { string cmd; int port = 56568; Server Serv = new Server(); // Создаем новый экземпляр класса // сервера Serv.Create(port); while (true) { cmd = Console.ReadLine(); // Ждем фразы EXIT когда // понадобится выйти из приложения. // типа интерактивность. if (cmd == "EXIT") { Serv.Close(); // раз выход – значит выход. Серв-нах. return; } } } public class Server // класс сервера. { private int LocalPort; private Thread ServThread; // экземпляр потока TcpListener Listener; // листенер)))) public void Create(int port) { LocalPort = port; ServThread = new Thread(new ThreadStart(ServStart)); ServThread.Start(); // запустили поток. Стартовая функция – // ServStart, как видно выше } public void Close() // Закрыть серв? { Listener.Stop(); ServThread.Abort(); return; } private void ServStart() { Socket ClientSock; // сокет для обмена данными. string data; byte[] cldata = new byte[1024]; // буфер данных Listener = new TcpListener(LocalPort); Listener.Start(); // начали слушать Console.WriteLine("Waiting connections on " + Convert.ToString(LocalPort) + " port"); try { ClientSock = Listener.AcceptSocket(); // пробуем принять // клиента } catch { ServThread.Abort(); // нет – жаль( return; } int i = 0; if (ClientSock.Connected) { while (true) { try { i = ClientSock.Receive(cldata); // попытка чтения // данных } catch { } try { if (i > 0) { data = Encoding.ASCII.GetString(cldata).Trim(); Console.WriteLine("<" + data); data = " "; if (data == "CLOSE") // если CLOSE – // вырубимся { ClientSock.Send(Encoding.ASCII.GetBytes("Closing the server...")); ClientSock.Close(); Listener.Stop(); Console.WriteLine("Server closed. Reason: client wish! Type EXIT to quit the application."); ServThread.Abort(); return; } else { // нет – шлем данные взад. ClientSock.Send(Encoding.ASCII.GetBytes("Your data: " + data)); } } } catch { ClientSock.Close(); // Listener.Stop(); Console.WriteLine("Client disconnected. Server closed."); ServThread.Abort(); } } } } } } }
while (Serv.Close = true){Serv.Create(port);}
Решение задачи: «Вечный сервер»
textual
Листинг программы
static void Main(string[] args) { string cmd; int port = 56568; Server Serv = new Server(); // Создаем новый экземпляр класса сервера //ServThread = new Thread(new ThreadStart(ServStart)); //ServThread.Start(); while (true) { Serv.Create(port); cmd = Console.ReadLine(); . if (cmd == "EXIT") { Serv.Close(); return; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д