Сервер отказывается принимать запросы от клиентов

Это программа для поиска строк из файла. Требуемая клиентом строка передается со стороны клиента, в моем случае с помощью telnet. Программа, которую я написал, является серверной. Он принимает несколько клиентов. Но проблемы, которые я не могу исправить, -

  • Он не проверяет строки из файла.
  • Как только клиент подключается, он не может вводить строки, которые он хочет найти в этом конкретном файле.
  • Он не отправляет ответ обратно (т.е. присутствует ли строка в файле или нет) клиенту. Он отображается только на стороне сервера.

Как мне поступить дальше? Может ли кто-нибудь сказать мне, где я ошибаюсь? Может ли кто-нибудь помочь мне с кодом? Это моя проба программы..

class Program
{

    static void Main(string[] args)
    {
        IPAddress ipad = IPAddress.Parse("192.168.0.181");
        TcpListener serversocket = new TcpListener(ipad, 8888);
        TcpClient clientsocket = default(TcpClient);
        Byte[] bytes = new Byte[256];

        serversocket.Start();

        Console.WriteLine(">> Server Started");
        while(true)
        {
            clientsocket = serversocket.AcceptTcpClient();
            Console.WriteLine("Accepted Connection From Client");

            LineMatcher lm = new LineMatcher(clientsocket);
            Thread thread = new Thread(new ThreadStart(lm.Run));
            thread.Start();
            Console.WriteLine("Client connected");
        }


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

    }
}


public class LineMatcher //I've jumbled it up here. Don't know what exactly to do..
{
     public string fileName = "c:/myfile2.txt";
     private TcpClient _client;

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

     public void Run()
     {
         try
         {
              StreamReader sr = new StreamReader("c:/myfile2.txt");
              using (var reader = new StreamReader(_client.GetStream()))
              {
                  string line ="";
                  int lineNumber = 0;
                  while (null != (line = sr.ReadLine()))
                         {
                             lineNumber += 1;
                             byte[] data = new byte[1024];
                             NetworkStream stream = _client.GetStream();
                             //if (line.Equals(line))
                             for (int ct = stream.Read(data,0, data.Length-1); 0 < ct; ct = stream.Read(data,0,data.Length-1))

                                 line += Encoding.ASCII.GetString(data, 0, ct);
                             line = line.Trim();

                             {
                                 lineNumber.ToString();

                                 data = Encoding.ASCII.GetBytes(line);
                                 _client.Client.Send(data, data.Length, SocketFlags.None);
                                 Console.WriteLine("Line {0} matches {1}", lineNumber, line);
                             }
                         }
             }
         }
         catch (Exception ex)
         {
             Console.Error.WriteLine(ex.ToString());
         }
         Console.WriteLine("Closing client");
         _client.Close();
     }
 }

person 3692    schedule 05.04.2012    source источник
comment
из этого кода мы не можем увидеть, что происходит - вы должны сначала попытаться отладить свой код, чтобы определить места, которые запускаются (введен ли lm.Run), и, конечно, нам нужно увидеть код в LineMatcher.Run, так как это может быть решающий момент   -  person Random Dev    schedule 05.04.2012
comment
@CarstenKönig Большое спасибо, Карстен. Но я тебя не понял. Прошел всего месяц с тех пор, как я начал изучать C#. Не могли бы вы сказать мне, как мне это сделать? А LineMatcher.Run? Как?   -  person 3692    schedule 05.04.2012
comment
Вы не знаете, как установить точку останова и отладить код? - Просто установите точку останова (F9), где вы вызываете thread.Start() и еще одну внутри метода Run в вашем классе LineMatcher - затем запустите свою программу (F5) и используйте telnet для подключения и посмотрите, сработали ли ваши точки останова и что ваша программа делает оттуда ... и LineMatcher.Run — это имя метода Run, в котором происходит магия (вы же написали это, не так ли?)   -  person Random Dev    schedule 05.04.2012
comment
Кстати: 3 избранных. и 2 плюса по этому поводу? - вау, ты заставил своих друзей увеличить твою репутацию?   -  person Random Dev    schedule 05.04.2012
comment
@CarstenKönig Я абсолютно никого не знаю здесь на SO. Да, я написал это, просматривая множество руководств. И спасибо за процедуру, я буду следить за всем, что вы меня просили, и посмотреть, что идет не так. :) Еще начинающий Картсен. Извини за это. Интересно узнать много. И я счастлив сказать, что я.. :)   -  person 3692    schedule 05.04.2012
comment
Без обид, но вы действительно должны позаботиться о том, чтобы включить важные части — и это код, в котором вы обрабатываете клиента — пожалуйста, просто добавьте это, и мы могли бы помочь вам   -  person Random Dev    schedule 05.04.2012
comment
Я последовал тому, что вы сказали. Когда она достигает точки останова в thread.Start, программа дальше не идет.   -  person 3692    schedule 05.04.2012
comment
ок - хорошая мысль: вы можете подключиться к вашей программе. Программа не будет продолжаться, если вы не скажете ей об этом (например, снова F5 - загляните в Debug-Menu!) - но вы можете удалить эту точку останова сейчас, это было просто для проверки, нажали ли вы этот код (можно было использовать консоль .WriteLine-debugger тоже;) - не обязательно иметь вторую точку останова в вашем методе Thread (Run) и повторить - посмотрите, что там делает ваш код, пройдя через него (вспомните Debug-Menu)... и подумайте о чтении некоторые учебники/книги о том, как использовать IDE, отладчики и т. д. - это очень простой инструментарий!   -  person Random Dev    schedule 05.04.2012
comment
@CarstenKönig - Хорошо, Картсен, я сделал это. Но программа по-прежнему отказывается продолжать работу даже после удаления точки останова из thread.start. У меня только что была точка останова в методе потока Run, то есть public void Run. Все равно ничего не делает. Он останавливается там, где раньше, когда была точка останова на thread.start. Что мне делать дальше?   -  person 3692    schedule 05.04.2012
comment
@CarstenKönig - Хорошо, чтобы получить сообщение от клиента, я добавил это между кодом. Это не работает. Я снова ошибся, написав код? Вот я и добавил. byte[] data = new byte[1024]; NetworkStream stream = _client.GetStream(); for (int ct = stream.Read(data,0, data.Length-1); 0 < ct; ct = stream.Read(data,0,data.Length-1)) line += Encoding.ASCII.GetString(data, 0, ct); line = line.Trim(); Это то, что я добавил в while(null---) { The above code } Это неправильно?   -  person 3692    schedule 05.04.2012
comment
отладчик натыкается на код там? Это немного беспорядок, но я до сих пор не знаю, где ваш код останавливается (вы видите свои сообщения в консоли?)   -  person Random Dev    schedule 05.04.2012
comment
@CarstenKönig Отладчик доходит до кода --› for (int ct = stream.Read(data,0, data.Length-1); 0 < ct; ct = stream.Read(data,0,data.Length-1)) Значения (строки), которые я передаю со стороны клиента (telnet), не отображаются на стороне сервера. Но при отладке каждой строки в программе значения появляются ( если это было то, что вы имели в виду как сообщения в консоли). Я в замешательстве, и я полагаю, что я запутал вас тоже. Прости, Карстен. :)   -  person 3692    schedule 05.04.2012
comment
@CarstenKönig Тем не менее, я очень ценю ваше терпение и помощь .. Огромное спасибо .. :)   -  person 3692    schedule 05.04.2012
comment
@ 3692 - Если у вас есть код, о котором нужно спросить, обновите вопрос, я не могу работать с комментариями. Кроме того, почему вы используете 127.0.0.1, это локальный адрес обратной связи.   -  person Security Hound    schedule 05.04.2012
comment
@Ramhound Я обновил вопрос .. Я просто использовал этот адрес временно ..   -  person 3692    schedule 05.04.2012
comment
ну только сейчас увидел - байты из файла читать не хочешь? - тогда вам следует прочитать это с sr вместо stream - здесь становится много времени, поэтому я постараюсь включить это в ответ   -  person Random Dev    schedule 05.04.2012


Ответы (1)


Я думаю, что вы поменяли местами некоторые части в своем методе Run - вот версия, которая должна выполнять эту работу:

public void Run()
{
     byte[] data;
     try
     {
        using (var r = new StreamReader("c:/myfile2.txt"))
        {
            string line ="";
            int lineNumber = 0;
            while (null != (line = r.ReadLine()))
            {
                data = Encoding.ASCII.GetBytes(line + "\n");
                _client.Client.Send(data, data.Length, SocketFlags.None);
            }
        }
     }
     catch (Exception ex)
     {
         Console.Error.WriteLine(ex.ToString());
     }
     Console.WriteLine("Closing client");
     _client.Close();
}

Обратите внимание, что я не уверен на 100%, что вы пытаетесь сделать (я думаю, вы хотите, чтобы ваш текстовый файл отправлялся построчно на ваш терминал), поэтому вам, возможно, придется изменить некоторые биты здесь и там.

Не знаю, откуда взялись ошибки Stream в вашем коде, но я думаю, вы пробовали различные учебники/фрагменты и забыли почистить;)

person Random Dev    schedule 05.04.2012
comment
Ха-ха. Ваше право :) Ваша программа работает абсолютно нормально. Но на самом деле я пытаюсь сделать следующее: Предположим, есть клиент, который хочет искать строки в файле (он просто хочет проверить, присутствует ли слово в файле или нет), он просто вводит строку ( в telnet). Программа на стороне сервера (которую вы мне помогали) должна искать строку, и если она присутствует в файле, она должна отправить клиенту сообщение о том, что да, {строка} присутствует или она должна скажите нет, это не так. Клиент должен иметь возможность отправить строку, которую он хочет найти, на сервер. - person 3692; 06.04.2012
comment
Хорошо, это действительно будет еще немного работы (в основном вы должны сказать: вот идет x байтов, а затем сначала отправьте байты для строки запроса - на стороне сервера получите 4 (например) байта для длины строки запроса, а затем оставшиеся байты строки запроса и т. д. - в конце концов, если это становится таким сложным, вам следует подумать об использовании WCF или чего-то подобного, что делает эти низкоуровневые связи для вас - person Random Dev; 06.04.2012
comment
Доброе утро! Да, вы правильно поняли. Но меня попросили просто использовать консольное приложение С# и закодировать его. Будет ли сложно сделать это на С#? - person 3692; 06.04.2012
comment
Никакой WCF не является довольно простым, и вы можете разместить эти службы в консольном приложении C#. - person Random Dev; 06.04.2012
comment
Пытался сделать это в WCF. Меня попросили не использовать его. Снова вернемся к консольному приложению С#. Как мне это сделать? :( - person 3692; 09.04.2012
comment
У вас уже есть все, что вам нужно - попробуйте сделать это самостоятельно, и если вы не можете, пожалуйста, откройте новый вопрос с подробным описанием того, что вы пытались и где у вас не получилось. - person Random Dev; 09.04.2012
comment
Я решил это. :) Просто взгляните на это, если это правильно. Вот ссылка. :) stackoverflow.com/questions/10086689/ - person 3692; 18.04.2012