To find a particular string using telnet through a server side C# Console

偶尔善良 提交于 2019-12-13 09:07:35

问题


I have written this code to check for a particular string from a file. Right now it checks for the string. But how can I send the reply back saying "it is present" to the client? The server side program should have all the codes. It also accepts multiple clients.

The Procedure of this program is as follows

Basically if a client wants to check if there's a particular string(word) in a file, he connects this code through a port on telnet. He types in the strings he wants to search(on telnet) and send it to the server side. And this server side program checks it for him from the file. And if it is present, it sends a message back to the client saying "The string is present in the file" And if it isn't, It should send a message saying "It is not".

The search string("hello") is in this program. How can I enable the client to search for it from client side(telnet)? This is where I've come till with a lot of help and tutorials. Can someone please help me?

EDITED - I have changed the code such that it sends a reply back to the client. All I need to know now is, how can I enable the client to search (type the word he wants to search for) through the client side(telnet)? Any help will be really appreciated. I have updated my code too.

Thank you.

class Program
{
    static void Main(string[] args)
    {
        IPAddress ipad = IPAddress.Parse("127.0.0.1");
        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
{
    public string fileName = "c:/myfile2.txt";
    private TcpClient _client;

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

    public void Run()
{
    byte[] data = new byte[256];
    NetworkStream strm = _client.GetStream();
    try
    {
        using (var r = new StreamReader("c:/myfile2.txt"))
        {

            string line = "";
            bool done = false;

            int lineNumber = 0;
            String s = r.ReadToEnd();

            ASCIIEncoding encoder = new ASCIIEncoding();
            while (String.IsNullOrEmpty(s))
            {
                data = encoder.GetBytes("There is no data in the file.");
                Console.WriteLine("There is no data in the file.");
            }
            if (s.IndexOf("hello", StringComparison.CurrentCultureIgnoreCase) >= 0)
            {
                data = encoder.GetBytes("It is Present.");

            }
            else
            {
                data = encoder.GetBytes("It is not Present");
            }
        }
    }
    catch (Exception ex)
    {
        Console.Error.WriteLine(ex.ToString());
    }

    strm.Write(data, 0, data.Length);
    strm.Flush();
    Console.WriteLine("Closing client");
    _client.Close();
}

}


回答1:


Instead of if (s==null), you should check if the string contains the word. Being very creative, we can check for the word "word" like so: if (s.IndexOf("word") >= 0) which searches for the location of "word" within s and returns the index. In C#, indexes always start at 0. If the string "word" is not contained within your file string, it will return -1. Therefore that if statement will return true if the word is contained, or false if it is not.

Think of if as a statement which takes only one parameter. And that parameter is either true or false. The (s==null) is an expression which returns the value true or false which is then used by the if statement.

However, this will not work, if for instance, the file reads: THIS IS A WORD, because "word" does not equal "WORD". You can get around this by using a case insensitive compare like so:

if(s.IndexOf("word", StringComparison.CurrentCultureIgnoreCase) >= 0) {
  // contains "word"
} else {
  // does not contain "word"
}

Have a look at the following for reference

  • http://msdn.microsoft.com/en-us/library/ms228362(v=vs.80).aspx
  • http://msdn.microsoft.com/en-us/library/system.string.aspx



回答2:


Your client applications will only be able to search once. This is because after you perform the search, you close the connection.

Console.WriteLine("Closing client");
_client.Close();

If you want the connection to stay open you will need to include a loop to ensure you return to the beginning of the LineMatcher class to re-search.

Rather than checking the IndexOf this string, I'd instead simply use the Contains method. While IndexOf is designed to find where a substring is located within a string, Contains is built for the specific purpose of simply checking whether or not a substring exists. Note that this is not case insensitive.

else if (s.Contains("HTTP"))
{

I would strongly recommend you get the searching application working first, as a stand-alone application, and then write a telnet server which launches your original application. These are two separate functions, and you'll find it a lot easier to test them individually.




回答3:


I solved it. :) This is how I did it. Any suggestions on improving it?

namespace ServerSideApplication
{
    class Program
    {
     static void Main(string[] args)
      {
        TcpListener socketListener = new TcpListener(8888);
        TcpClient netClient = default(TcpClient);
        StreamReader sr;
        StringBuilder sb = new StringBuilder();

        socketListener.Start();
        sr = new StreamReader("c:\\test.txt");
        sb.Append(sr.ReadToEnd());
        while (true)
        {
            netClient = socketListener.AcceptTcpClient();
            Console.WriteLine("Accepted Connection From Client" + Environment.NewLine + "Client connected");
            ServerSide ss = new ServerSide();
            ss.startServerSide(netClient, sb);
        }
        socketListener.Stop();
    }
}

class ServerSide
{

    TcpClient netClient;
    StringBuilder sb;

    public void startServerSide(TcpClient netClient, StringBuilder sb)
    {
        this.netClient = netClient;
        this.sb = sb;
        Thread thread = new Thread(processRequest);
        thread.Start();
    }
    private void processRequest()
    {
        byte[] data = new byte[4096];
        int bytesRead;
        NetworkStream strm = netClient.GetStream();
        bytesRead = 0;
            try
            {

                NetworkStream ns = netClient.GetStream();

                string clientChar = "", s = "";
                do
                {
                    bytesRead = ns.Read(data, 0, (int)data.Length);
                    clientChar = Encoding.ASCII.GetString(data).Replace("\0", "");
                    s += clientChar;
                } while (clientChar != Environment.NewLine);

                s = s.Trim();

                ASCIIEncoding encoder = new ASCIIEncoding();

                if (String.IsNullOrEmpty(s))
                {
                    data = encoder.GetBytes("There is no data in the file.");
                    Console.WriteLine("There is no data in the file.");
                }

                if (sb.ToString().Contains(s))
                {
                    data = encoder.GetBytes("It Is Present In The File.");
                }
                else
                {
                    data = encoder.GetBytes("It Is Not Present In The File.");
                }
                strm.Write(data, 0, data.Length);
                strm.Flush();
                Console.WriteLine("Closing client");
                netClient.Close();
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine(ex.ToString());
            }
    }
}

}



来源:https://stackoverflow.com/questions/10086689/to-find-a-particular-string-using-telnet-through-a-server-side-c-sharp-console

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!