-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

の代わりにif (s==null)、文字列に単語が含まれているかどうかを確認する必要があります。非常に創造的であるため、次のように「単語」という単語をチェックできます。if (s.IndexOf("word") >= 0)これは、「単語」内の場所を検索しs、インデックスを返します。C#では、インデックスは常に0から始まります。文字列 "word"がファイル文字列に含まれていない場合、-1が返されます。したがって、その単語が含まれている場合、または含まれていない場合、そのifステートメントが返されます。truefalse

1つのパラメーターifのみをとるステートメントと考えてください。そして、そのパラメータはまたはのいずれかです。は、値を返す式、またはifステートメントで使用される式です。truefalse(s==null)truefalse

ただし、たとえば、ファイルが次のようになっている場合、これは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 に答える
1

クライアントアプリケーションは1回しか検索できません。これは、検索を実行した後、接続を閉じるためです。

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

接続を開いたままにしておきたい場合は、LineMatcherクラスの最初に戻って再検索できるようにループを含める必要があります。

この文字列をチェックするのでIndexOfはなく、単にContainsメソッドを使用します。IndexOf部分文字列が文字列内のどこにあるかを見つけるように設計されていますが、部分文字列Containsが存在するかどうかを単にチェックするという特定の目的のために構築されています。これは大文字と小文字を区別しないことに注意してください。

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

最初に検索アプリケーションをスタンドアロンアプリケーションとして機能させてから、元のアプリケーションを起動するTelnetサーバーを作成することを強くお勧めします。これらは2つの別個の関数であり、個別にテストする方がはるかに簡単です。

于 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 に答える