-1

我编写了这段代码来检查文件中的特定字符串。现在它检查字符串。但是我怎样才能将回复说“它存在”发回给客户呢?服务器端程序应该有所有的代码。它还接受多个客户端。

该程序的程序如下

基本上,如果客户想要检查文件中是否有特定的字符串(单词),他会通过 telnet 上的端口连接此代码。他输入他想要搜索的字符串(在 telnet 上)并将其发送到服务器端。这个服务器端程序会从文件中为他检查。如果它存在,它会向客户端发送一条消息,说“文件中存在字符串”,如果不存在,它应该发送一条消息说“它不是”。

搜索字符串(“hello”)在这个程序中。如何使客户端能够从客户端(telnet)搜索它?这是我得到很多帮助和教程的地方。有人可以帮帮我吗?

已编辑 - 我已更改代码,以便将回复发送回客户端。我现在需要知道的是,我怎样才能让客户端通过客户端(telnet)搜索(输入他想要搜索的单词)?任何帮助将不胜感激。我也更新了我的代码。

谢谢你。

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();
}

}

4

3 回答 3

1

您的客户端应用程序将只能搜索一次。这是因为在执行搜索后,您关闭了连接。

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

如果您希望连接保持打开状态,则需要包含一个循环以确保您返回到LineMatcher课程的开头重新搜索。

我不检查IndexOf这个字符串,而是简单地使用该Contains方法。虽然IndexOf旨在查找子字符串在字符串中的位置,但Contains其构建的特定目的是简单地检查子字符串是否存在。请注意,这区分大小写。

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

我强烈建议您首先让搜索应用程序作为一个独立的应用程序运行,然后编写一个 telnet 服务器来启动您的原始应用程序。这是两个独立的功能,您会发现单独测试它们要容易得多。

于 2012-04-16T05:51:56.490 回答
1

我解决了。:) 我就是这样做的。有什么改进的建议吗?

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());
            }
    }
}

}

于 2012-04-18T06:47:02.387 回答
1

而不是if (s==null),您应该检查字符串是否包含该单词。非常有创意,我们可以像这样检查单词“word”:if (s.IndexOf("word") >= 0)在其中搜索“word”的位置s并返回索引。在 C# 中,索引始终从 0 开始。如果字符串“word”不包含在您的文件字符串中,它将返回 -1。因此,如果包含该单词,则该if语句将返回true,或者false如果不包含。

if其视为仅采用一个参数的语句。该参数是trueor false。The(s==null)是一个表达式,它返回值truefalse由 if 语句使用。

但是,这将不起作用,例如,如果文件读取:THIS IS A WORD,因为“word”不等于“WORD”。您可以通过使用不区分大小写的比较来解决此问题,如下所示:

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

看看以下内容以供参考

于 2012-04-10T11:23:43.453 回答