【问题标题】:Server refuses to accept requests from clients服务器拒绝接受来自客户端的请求
【发布时间】:2012-04-18 20:33:23
【问题描述】:

这是一个从文件中搜索字符串的程序。客户端所需的字符串是从客户端给出的,在我的例子中,使用 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();
     }
 }

【问题讨论】:

  • 从这段代码中我们无法看到发生了什么 - 您应该首先尝试调试代码以识别运行的位置(输入 lm.Run),当然我们需要查看LineMatcher.Run 中的代码,因为这可能是关键点
  • @CarstenKönig 非常感谢 Carsten。但我没有得到你。从我开始学习 C# 到现在才一个月。你能告诉我我该怎么做吗?和 LineMatcher.Run?怎么样?
  • 你不知道如何设置断点和调试代码? - 只需在 LineMatcher 类中调用 thread.Start()Run 方法中的另一个断点 (F9) - 然后启动程序 (F5) 并使用 telnet 进行连接,看看你的断点是否被命中以及什么你的程序是从那里开始的...... LineMatcher.Run 是方法的名称 Run 发生 magic 的地方(你确实写了 - 不是吗?)
  • 顺便说一句:3个最爱。对此有 2 票赞成? - 哇,你让你的朋友增加你的声望了吗?
  • @CarstenKönig 我绝对不认识任何人。是的,我确实通过很多教程编写了它。谢谢你的程序,我会按照你的要求去做,看看出了什么问题。 :) 仍然是新手卡特森。对于那个很抱歉。有兴趣学习很多。我很高兴地说,我是.. :)

标签: c# client-server tcpclient serversocket tcplistener


【解决方案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% 确定您要做什么(我认为您希望您的文本文件逐行发送到您的终端) - 所以您可能需要在这里和那里更改一些位。

不知道您代码中的 Stream-messes 来自哪里,但我猜您尝试了各种教程/sn-ps 并忘记清理 ;)

【讨论】:

  • 哈哈。你的权利:) 你的程序工作得很好。但我实际上想做的是——假设有一个客户,他想从文件中搜索字符串(他只是想检查文件中是否存在这个词),他只需输入字符串(在 telnet 中)。服务器端程序(你一直在帮助我)应该搜索字符串,如果它存在于文件中,它应该向客户端发送一条消息“是的 {string} 存在”或它应该说“不,它不是”。客户端应该能够将他想要搜索的字符串发送到服务器。
  • 好的,这确实需要更多的工作(基本上你必须说:这里有 x 个字节,然后首先发送查询字符串的字节 - 在服务器端接收 4(例如)字节查询字符串的长度,然后是剩余的查询字符串字节等 - 毕竟,如果它变得如此复杂,您应该考虑使用 WCF 或类似的东西来为您提供这些低级通信
  • 早安!是的,你没看错。但我被要求只使用 c# 控制台应用程序并对其进行编码。在c#中会很难做到吗?
  • 没有 WCF 相当简单,您可以在 C# 控制台应用程序中托管这些服务
  • 尝试在 WCF 中进行操作。我被要求不要使用它。再次返回 c# 控制台应用程序。我该怎么做? :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 2020-10-27
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
  • 1970-01-01
相关资源
最近更新 更多