不断运行的服务器

| 当客户端断开连接时,服务器关闭。告诉我在第一次会议结束后如何保持联系新客户的能力。谢谢。
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;
                }
            }


            //while (Serv.Close() == true) { Serv.Create(port); }
        }

        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);
                                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();
                        }
                    }
                }
            }
        } 
    }
}
已邀请:
典型的线程服务器代码将读取更多这样的内容(在伪代码中,因为我不知道足够的Java详细信息来准确地编写它,并且因为C有点令人窒息):
socket s = new socket
bind s to an optional IP, port
listen s
while true
    cli = accept s
    t = new thread(handle_client, cli)
    maybe disown thread, so no need to join it later
    t.start
重要的一点是创建套接字,将其绑定到地址,并且ѭ2outside都在循环外部处理,
accept()
和起始线程在循环内部。 您可能需要将整个块包装在另一个线程中;那是可以接受的。重要的部分是将
listen
accept
和每个客户端
thread
分开。这使您的代码可以停止接受新连接,但处理现有客户端,直到它们断开连接,或者在它们使用资源分配但继续接受连接时断开现有连接,等等。(请注意,如果有任何单个客户端,最后的
catch
块将如何终止服务器套接字会引发异常;使用通常的服务器布局很容易避免此类代码。)
更换
                                ServThread.Abort();                                    
                                return;
用continue代替,这不会中断while循环,但会停止当前的“回合”。请考虑阅读以下内容:http://www.codeproject.com/KB/IP/serversocket.aspx从中构建的好项目

要回复问题请先登录注册