Вечный сервер - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, нужно поставить прием новых пользователей в цикл(если в данный момент активного нет) Пытаюсь не закрыть сервер - новых он не принимает . Если закрыть и открыть сервак после отключения клиента - он ловит цикл и все равно нового не берет(можно поймать ошибку Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт) думал не успевает закрыться сервер - поставил ожидание, ждет и только после этого кричит ошибку). Испробовал кучу других вариантов но результат один - второго коннекта добиться не смог. Могу ошибаться но вроде есть параметр позволяющий подключаться к слушалке определенное кол-во раз, но инфы не нашел. Последний catch и есть отключение клиента от сервера
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);}
данный код выдает ошибку Cannot convert method group 'Close' to non-delegate type 'bool'. Did you intend to invoke the method?

Решение задачи: «Вечный сервер»

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;
                }
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5