Как мне принять нескольких клиентов по этой программе? - PullRequest
0 голосов
/ 28 марта 2012

Благодаря многому обучению и исследованиям, я написал программу на стороне сервера. Но проблема этой программы в том, что она не принимает несколько клиентов, и я также хотел знать, как отправить вывод обратно на сторону клиента, а не отображать его на стороне сервера. Может кто-нибудь помочь мне с кодом? Это то, что я пробовал до сих пор -

Программа класса {

    private static Regex _regex = new Regex("not|http|console|application", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);


    static void Main(string[] args)
    {
        {

            TcpListener serversocket = new TcpListener(8888);
            TcpClient clientsocket = default(TcpClient);
            serversocket.Start();

            Console.WriteLine(">> Server Started");
            clientsocket = serversocket.AcceptTcpClient();
            Console.WriteLine("Accept Connection From Client");

            try
            {
                using (var reader = new StreamReader(clientsocket.GetStream()))
                {
                    string line;
                    int lineNumber = 0;
                    while (null != (line = reader.ReadLine()))
                    {
                        lineNumber += 1;
                        foreach (Match match in _regex.Matches(line))
                        {

                            Console.WriteLine("Line {0} matches {1}", lineNumber, match.Value);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine(ex.ToString());
            }
            clientsocket.Close();
            serversocket.Stop();
            Console.WriteLine(" >> exit");
            Console.ReadLine();
        }
    }
    }

1 Ответ

0 голосов
/ 28 марта 2012

Вы можете изменить его на что-то вроде этого.

static void Main(string[] args)
{
   TcpListener serversocket = new TcpListener(8888);
   TcpClient clientsocket = default(TcpClient);
   serversocket.Start();

   Console.WriteLine(">> Server Started");
   while(true)
   {
      clientsocket = serversocket.AcceptTcpClient();
      Console.WriteLine("Accept Connection From Client");
      LineMatcher lm = new LineMatcher(clientsocket);
      Thread thread = new Thread(new ThreadStart(lm.Run));
      thread.Start();
      Console.WriteLine("Client connected");
   }

   serversocket.Stop();
   Console.WriteLine(" >> exit");
   Console.ReadLine();
}

И затем этот отдельный класс обрабатывает соответствие строк

public class LineMatcher{
    private static Regex _regex = new Regex("not|http|console|application", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);

    private TcpClient _client;

    public LineMatcher(TcpClient client)
    {
        _client = client;
    }

    public void Run()
    {
        try
        {
            using (var reader = new StreamReader(_client.GetStream()))
            {
                string line;
                int lineNumber = 0;
                while (null != (line = reader.ReadLine()))
                {
                    lineNumber += 1;
                    foreach (Match match in _regex.Matches(line))
                    {

                        Console.WriteLine("Line {0} matches {1}", lineNumber, match.Value);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Console.Error.WriteLine(ex.ToString());
        }
        Console.WriteLine("Closing client");
        _client.Close();
    }
}

Это чисто доказательство концепции и никоим образом не стабильный код;)
Обратите внимание, что это никак не влияет на дочерние потоки.
Также нет правильного способа выключить слушателя из-за while (true)

...