1

我有以下服务器代码:

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",就可以建立连接,但是我什么也没有收到。你认为是什么问题?我该如何解决?

4

1 回答 1

1

马修,

正如退休的 skeet 先生所暗示的那样,你只掌握了一半的方程式。然后您需要实例化该类并调用 Main() 方法。

您可以这样做:

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

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

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

listener = new TcpListener();

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

[编辑]保存阅读下面的评论。Matthew 采取的最终解决方案是回到控制台解决方案并从 webapp 调用它。通过这种方式,他获得了几场胜利:

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

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

于 2013-07-04T09:14:23.813 回答