当前位置:  开发笔记 > 编程语言 > 正文

程序挂起,等待我永远不会给出的输入

如何解决《程序挂起,等待我永远不会给出的输入》经验,为你挑选了1个好方法。

我正在使用visual studio来编写这个小型TcpServer.

这是非常具体的.服务器侦听端口1234并位于IP 127.0.0.1上.我们的老师给了我们一个程序,当您单击"连接"时,该程序尝试连接到该IP上的该端口.它适用于其他所有人,因此我必须是编码错误.

当我点击连接时,程序会在流上发送"GET"字样,我必须对所有已连接的IP地址列表进行响应,然后是仅包含a的换行符.

当我断开连接时,程序发送单词"REM",我只需要从我的列表中删除(这是一个通用列表)

我有一个类TCPServer(我们必须自己创建),它有这个作为主要代码:

this.tl = new TcpListener(IPAddress.Any, PORT);
tl.Start();
while(true)
{
  TcpClient tcl = tl.AcceptTcpClient();//here the server will wait forever untill someone connects, meaning the "new Thread" statement is never reached untill someone connects.
  TcpHelper th = new TcpHelper(tcl,conf);
  new Thread(new ThreadStart(th.Start)).Start();//should be multi-threaded, not sure if it is.
  //t.Start();
}

TcpHelper看起来像这样(在使用中查找注释文本"这里是问题"):

public class TcpHelper
{
    private TcpClient tc;
    private IPEndPoint ipe;
    private string get;
    private Configuration conf;

    public TcpHelper(TcpClient tc, Configuration conf)
    {
       this.tc = tc;
       this.conf = conf;
    }

    public void Start()
    {
       using (NetworkStream nws = this.tc.GetStream())
       {
           using (StreamReader sr = new StreamReader(nws))
           {
              using (StreamWriter sw = new StreamWriter(nws))
              {
                  this.ipe = (IPEndPoint)tc.Client.RemoteEndPoint;
                  this.conf.List.Add(this.ipe.Address);
                  bool conn = true;

                  while (conn)
                  {
                      this.get = sr.ReadLine();//here's the problem
                      switch (this.get)
                      {
                          case "GET":
                              foreach (IPAddress address in this.conf.Lijst)
                              {
                                  sw.WriteLine(address.ToString());
                              }
                              sw.WriteLine(".");
                              break;

                          case "REM":
                              this.conf.List.Remove(this.ipe.Address);
                              sw.WriteLine("OK.");
                              conn = false;
                              break;

                          default:
                              break;
                     }
                  }
              }
          }
      }
  }

  #region Properties
  public IPEndPoint Ipe
  {
      get
      {
          return this.ipe;
      }
  }
  #endregion
}

Jonathan Rup.. 6

我的猜测是你的问题是你正在调用sr.ReadLine(),但是输入不包含换行符,所以它被阻塞在那里等待永远不会出现的换行符.

你可能想尝试调用StreamReader.Read 3次来构建命令字符串(GET/REM),然后再对其进行操作.(注意:3次是因为所有命令都是三个字符).

Read将返回整数,但在检查它们不是-1(表示文件结束)后,您可以将该整数转换为char.



1> Jonathan Rup..:

我的猜测是你的问题是你正在调用sr.ReadLine(),但是输入不包含换行符,所以它被阻塞在那里等待永远不会出现的换行符.

你可能想尝试调用StreamReader.Read 3次来构建命令字符串(GET/REM),然后再对其进行操作.(注意:3次是因为所有命令都是三个字符).

Read将返回整数,但在检查它们不是-1(表示文件结束)后,您可以将该整数转换为char.

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有