C#-C#服务器充当控制台应用程序.不能作为Web应用程序工作
本文关键字:应用程序 Web 工作 不能 C#-C# 控制台 服务器 | 更新日期: 2023-09-27 18:21:11
我有以下服务器代码:
namespace Test
{
public class TCPListener
{
public static void Main()
{
TcpListener listener = null;
TcpClient client = null;
NetworkStream stream = null;
BinaryWriter writer = null;
try
{
listener = new TcpListener(new IPAddress(new byte[] { 127, 0, 0, 1 }), 5000);
listener.Start();
while (true)
{
using (client = listener.AcceptTcpClient())
{
using (stream = client.GetStream())
{
writer = new BinaryWriter(stream);
writer.Write("The message was received!");
}
}
}
}
catch (SocketException)
{
//Catch socket exception
}
}
}
}
现在,如果我把这个代码放在控制台应用程序中并使用telnet,我会在命令提示符上收到"The message was received"
消息。现在,我将此代码作为类复制并粘贴到web应用程序中(更改名称空间)。web应用程序解决方案部署在port 5000
上。除了服务器,它还包含许多用户可以浏览的页面。
不幸的是,如果我转到telnet并键入"telnet 127.0.0.1 5000"
,则实现了连接,但我没有收到任何消息。你认为问题出在哪里?我该如何解决?
Mathew,
正如名誉退休的斯凯先生所估计的那样,你只掌握了等式的一半。然后,您需要实例化该类并调用Main()方法。
以下是如何做到这一点:
TCPListener tcpListener = new TCPListener();
tcpListener.Main();
在基于web的解决方案的主要设置点(控制器操作或页面加载代码)中尝试一下。此外,更改Main上的方法签名(删除静态)。
此外,你似乎在内部调用你的类:
listener = new TcpListener();
这会引起大问题。。。我建议进行一些重构并重新思考Main
是如何工作的。您的第一个主要胜利是将上面的示例类从TCPListener重命名为其他类,因为那里似乎正在发生冲突。
[EDIT]保存阅读下面的评论。Matthew采用的最终解决方案是返回控制台解决方案,并从Web应用程序中调用它。通过这种方式,他赢得了几场胜利:
- 现有控制台应用程序已测试并运行
- 运动部件的织机联轴器
- 在其他项目中使用的可扩展性
- 能够实施并转移到项目的其他时间敏感元素
这里的要点是,"始终检查选项,并超越单一解决方案来解决问题"