Сървърът отказва да приема заявки от клиенти

Това е програма за търсене на низове от файл. Низът, изискван от клиента, се дава от страната на клиента, в моя случай, с помощта на 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. Да, написах го, преглеждайки много уроци. И благодаря за процедурата, ще следвам всичко, което ме помолихте и ще видя какво се обърка. :) Все още новак Cartsen. Съжалявам за това. Интересно да науча много. И се радвам да кажа, че съм.. :)   -  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 отново - погледнете в менюто за отстраняване на грешки!) - но можете да премахнете тази точка на прекъсване сега, беше само за да проверите дали сте ударили този код (може да използвате конзолата .WriteLine-debugger също;) - не се уверете, че имате втората точка на прекъсване във вашия Thread-method (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-method - ето версия, която трябва да свърши работата:

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

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

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