C# - C#Server作为控制台应用程序。不适用于Web应用程序

时间:2013-07-04 09:03:08

标签: c# stream telnet writer

我有一个服务器的代码:

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",就会实现连接,但是我没有收到任何连接。您认为这个问题是什么?我该如何解决?

1 个答案:

答案 0 :(得分:1)

马修,

正如荣誉退休人员所说,你只能抓住一半的等式。然后,您需要实例化该类并调用Main()方法。

以下是你如何做到这一点:

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

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

另外,你似乎在调用你自己的课程:

listener = new TcpListener();

这会引起很大的问题......我建议稍微重构并重新思考Main的工作原理。你的第一个主要胜利是将上面的示例类重命名为远离TCPListener的东西,因为那里似乎发生了碰撞。

[编辑] 要保存阅读以下评论。 Matthew采用的最终解决方案是返回控制台解决方案并从webapp调用它。这样他获得了几场胜利:

  • 现有的控制台应用已经过测试和使用
  • 活动部件的松散耦合
  • 在其他项目中使用的可扩展性
  • 能够实施并转移到项目的其他时间敏感元素

这里要说的是,“总是检查选项并思考解决问题的单一解决方案”