Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 程序挂起,等待我无法提供的输入_C#_Visual Studio_Tcplistener - Fatal编程技术网

C# 程序挂起,等待我无法提供的输入

C# 程序挂起,等待我无法提供的输入,c#,visual-studio,tcplistener,C#,Visual Studio,Tcplistener,我正在使用VisualStudio编程这个小型TcpServer 这是非常具体的。服务器侦听端口1234,位于IP 127.0.0.1上 我们的老师给了我们一个程序,当你点击“连接”时,它会尝试连接到IP上的那个端口。它对其他人都有效,所以这一定是我的编码错误 当我单击connect时,程序通过流发送单词“GET”,我必须用一个allready连接的IP地址列表和一个只包含一个地址的换行符来响应 当我断开连接时,程序会发送单词“REM”,我只需从列表中删除if(这是一个通用列表) 我有一个类TC

我正在使用VisualStudio编程这个小型TcpServer

这是非常具体的。服务器侦听端口1234,位于IP 127.0.0.1上 我们的老师给了我们一个程序,当你点击“连接”时,它会尝试连接到IP上的那个端口。它对其他人都有效,所以这一定是我的编码错误

当我单击connect时,程序通过流发送单词“GET”,我必须用一个allready连接的IP地址列表和一个只包含一个地址的换行符来响应

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

我有一个类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看起来像这样(在usings中查找注释文本“这里有问题”):


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

在对命令字符串(GET/REM)进行操作之前,您可能需要尝试调用3次以建立该命令字符串。(注意:3次是因为所有命令都是三个字符)


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

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

在对命令字符串(GET/REM)进行操作之前,您可能需要尝试调用3次以建立该命令字符串。(注意:3次是因为所有命令都是三个字符)


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

对不起,可能我不理解这一点。。。这是你写的代码吗

this.tl = new TcpListener(IPAddress.Any, PORT);
tl.Start();
while(true)
{
  TcpClient tcl = tl.AcceptTcpClient();
  TcpHelper th = new TcpHelper(tcl,conf);
  new Thread(new ThreadStart(th.Start)).Start();
  //t.Start();
}
这将把****从任何一台计算机中吹走。您正在无限循环,在每个循环上创建新线程。因此,如果您为每个循环创建一个新线程,并且每个循环需要一毫秒(假设它非常慢!),那么在五秒钟内您就有了5000个线程。每个人都试图在同一端口侦听

尝试使用单个线程。如果这是一个控制台应用程序,请使用console.ReadLine()阻止主线程,直到有人按enter键



有了新的信息。。。AcceptCpcClient块,但不应创建新线程,而是应在线程池中排队工作。

抱歉,可能我不理解这一点。。。这是你写的代码吗

this.tl = new TcpListener(IPAddress.Any, PORT);
tl.Start();
while(true)
{
  TcpClient tcl = tl.AcceptTcpClient();
  TcpHelper th = new TcpHelper(tcl,conf);
  new Thread(new ThreadStart(th.Start)).Start();
  //t.Start();
}
这将把****从任何一台计算机中吹走。您正在无限循环,在每个循环上创建新线程。因此,如果您为每个循环创建一个新线程,并且每个循环需要一毫秒(假设它非常慢!),那么在五秒钟内您就有了5000个线程。每个人都试图在同一端口侦听

尝试使用单个线程。如果这是一个控制台应用程序,请使用console.ReadLine()阻止主线程,直到有人按enter键




有了新的信息。。。AcceptCpcClient块,但工作不应创建新线程,而应在线程池中排队。

Huh。。?三次?对我来说这听起来是个可疑的想法,想详细说明一下吗?你应该继续阅读,直到你得到你想要的,假设协议规定了一个新的行,ReadLine似乎是一个完美的选择。放弃它,我在使用read()捕获时遇到了一个IOException。对不起,我应该更清楚一点——这3次是因为他的命令正好是3个字符。@WebDevHobo:你能提供IOException的文本吗?这将提供一些关于哪里出了问题的信息。我建议把它加入到问题中。嗯。。?三次?对我来说这听起来是个可疑的想法,想详细说明一下吗?你应该继续阅读,直到你得到你想要的,假设协议规定了一个新的行,ReadLine似乎是一个完美的选择。放弃它,我在使用read()捕获时遇到了一个IOException。对不起,我应该更清楚一点——这3次是因为他的命令正好是3个字符。@WebDevHobo:你能提供IOException的文本吗?这将提供一些关于哪里出了问题的信息。我建议将其添加到问题中。您可以使用语句相互叠加;你不必像坚果一样嵌套括号。我知道,我只是觉得这在视觉上更吸引人。你可以使用语句相互叠加;你不必像坚果一样嵌套括号。我知道,我只是觉得这在视觉上更吸引人。是的,我写了这个。但是考虑一下这个。1) 它必须永远循环,因为它是一个服务器。您没有关闭服务器。2) 循环不会继续,因为“tl.AcceptClient();”位等待连接,迫使程序等待。这意味着在有人连接之前不会有新的线程。好吧,这样就不太糟糕了。不过,每次连接都会创建一个新线程。这不好。在线程池中对这些线程进行排队,线程池将为您管理和重用线程?我检查过我的课程,但从来没有提到过。我会调查一下,和编程老师核实一下。我想知道如何跟踪哪个线程正在做什么。我希望这能帮到我,看起来是吗?你应该更新解决方案,在我看来乔纳森更相关。是的,我写了这个。但是考虑一下这个。1) 它必须永远循环,因为它是一个服务器。您没有关闭服务器。2) 循环不会继续,因为“tl.AcceptClient();”位等待连接,迫使程序等待。这意味着在有人连接之前不会有新的线程。好吧,这样就不太糟糕了。不过,每次连接都会创建一个新线程。这不好。在线程池中对这些线程进行排队,线程池将为您管理和重用线程?我检查过我的课程,但从来没有提到过。我会调查一下,然后和teac联系