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",则实现了连接,但我没有收到任何消息。你认为问题出在哪里?我该如何解决?

C#-C#服务器充当控制台应用程序.不能作为Web应用程序工作

Mathew,

正如名誉退休的斯凯先生所估计的那样,你只掌握了等式的一半。然后,您需要实例化该类并调用Main()方法。

以下是如何做到这一点:

TCPListener tcpListener = new TCPListener(); 
tcpListener.Main();

在基于web的解决方案的主要设置点(控制器操作或页面加载代码)中尝试一下。此外,更改Main上的方法签名(删除静态)。

此外,你似乎在内部调用你的类:

listener = new TcpListener();

这会引起大问题。。。我建议进行一些重构并重新思考Main是如何工作的。您的第一个主要胜利是将上面的示例类从TCPListener重命名为其他类,因为那里似乎正在发生冲突。

[EDIT]保存阅读下面的评论。Matthew采用的最终解决方案是返回控制台解决方案,并从Web应用程序中调用它。通过这种方式,他赢得了几场胜利:

  • 现有控制台应用程序已测试并运行
  • 运动部件的织机联轴器
  • 在其他项目中使用的可扩展性
  • 能够实施并转移到项目的其他时间敏感元素

这里的要点是,"始终检查选项,并超越单一解决方案来解决问题"