2012-04-05 2 views
-1

Это программа для поиска строк из файла. Строка, требуемая клиентом, предоставляется с клиентской стороны, в моем случае, с использованием 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(); 
    } 
} 
+0

из этого кода мы можем не возможно увидеть, что происходит - вы должны сначала попробуйте отладить ваш код, чтобы определить места, которые запускаются (входит в lm.Run), и, конечно же, нам нужно увидеть код в 'LineMatcher.Run', поскольку это может быть крутой пункт – Carsten

+0

@ CarstenKönig. Карстен. Но я не получил. Прошло всего месяц с тех пор, как я начал изучать C#. Не могли бы вы рассказать мне, как мне это сделать? И LineMatcher.Run? Как? – 3692

+0

Вы не знаете, как установить точку останова и отладить код? - Просто установите точку останова (F9), где вы вызываете 'thread.Start()' и еще один внутри метода 'Run' в вашем классе' LineMatcher', затем запустите свою программу (F5) и используйте telnet для подключения и проверьте, не совпадают ли ваши точки останова удаляются и что делает ваша программа оттуда ... и 'LineMatcher.Run' - это имя метода' Run', в котором происходит * волшебство * (вы написали его, не так ли?) – Carsten

ответ

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%, что вы пытаетесь сделать (я думаю, вы хотите, чтобы ваш текстовый файл отправлял строки за строкой в ​​ваш терминал) - так что вам, возможно, придется немного менять бит.

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

+0

Haha.Your right :) Ваша программа работает абсолютно нормально. Но то, что я на самом деле пытаюсь сделать, - Предположим, есть клиент, который хочет найти строки из файла (он просто хочет проверить, присутствует ли слово в файле или нет), он просто вводит строку (в telnet). Программа на стороне сервера (которую вы мне помогали повсюду) должна искать строку, и если она присутствует в файле, она должна отправить клиенту сообщение о том, что «да {строка} присутствует» или он должен сказать «нет, это не так». Клиент должен иметь возможность отправлять строку, которую он хочет найти для сервера. – 3692

+0

Хорошо, это будет действительно еще одна работа (в основном вы должны сказать: здесь идет x байтов, а затем сначала отправляются байты для строки запроса - на серверах получают байты 4 (например) для длины строк запроса, а затем оставшиеся querystring-байты и т. д. - в конце концов, если это усложняется, вам следует рассмотреть возможность использования WCF или чего-то подобного, что делает эти низкоуровневые коммуникации для вас – Carsten

+0

Good Mornin! Да, вы поняли это правильно. Но меня попросили просто использовать консольное приложение C# и код. Это сложно сделать в C#? – 3692

Смежные вопросы