C# Winform:尝试启动 TCP 客户端应用程序时出错

C# Winform : Error while trying to launch TCP client application

我有一个 C# Winform 应用程序正在尝试启动节点服务器。

然而,此代码是在不同的 cs 文件中编写的,Class1.cs 而不是 Form.cs 本身。我需要将其保存在不同的文件中。下面是我的 Class1.cs 文件:

using System.Net.Sockets;
namespace NodeApp
    {
        class Class1
        {
            static string HOST = "localhost";
            static int PORT = 9999;
            static TcpClient client;
            NetworkStream nwStream = client.GetStream();
           
            public void NodeServer()
            {
                string strCmdText;
                strCmdText = "/C node C:\Desktop\Test.js";
                Process process = new Process();
                ProcessStartInfo startInfo = new ProcessStartInfo();
                startInfo.FileName = "cmd.exe";
                startInfo.Arguments = strCmdText;
                process.StartInfo = startInfo;
                process.Start();
            }
        }
    
    }

现在,当我从 Form.cs 文件中调用该函数时,如下所示:

using System.Net.Sockets;
namespace NodeApp
{
    public partial class Form1 : Form
    {

        Class1 cl = new Class1();
        
        public Form1()
        {
            InitializeComponent();
            
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            cl.NodeServer();
        }

我在 NetworkStream nwStream = client.GetStream(); 得到 System.NullReferenceException。 因为没有客户端连接。但为了实现这一点,节点服务器应该 运行 首先正确 ?

我能够在基于控制台的应用程序中实现这一点,我在 Main 函数中的 client.Connect() 方法之前调用了 NodeServer() 方法

 static void Main(string[] args)

        {
            NodeSever();
            Thread.Sleep(1500);
            Console.WriteLine("Connecting to Node Server....");
            bool connected = false;
            client = new TcpClient();
            while(!connected)
            {
                Thread.Sleep(2000);
                try
                { 
                    client.Connect(HOST, PORT);
                    connected = true;
                }
                catch (SocketException e)
                {
                   
                }                
            }
        }

如何在 Form_load 方法(方法在 Class1.cs 本身中定义的 Winform 应用程序中复制相同的内容)。 Form_Load 是调用 NodeServer() 方法的正确事件吗?

您不应混合直接成员初始化和构造函数逻辑。这使得代码流程难以理解。

这一行声明了一个变量并对其进行了初始化:

NetworkStream nwStream = client.GetStream();

相当于把上面这行改成:

NetworkStream nwStream;

并添加以下内容作为构造函数的第一行:

nwStream = client.GetStream();

这表明客户端没有初始化。

对于您的情况,只需将连接代码移至单独的方法即可:

     public void Connect()
     {
            client = new TcpClient();
            while(!connected)
            {
                Thread.Sleep(2000);
                try
                { 
                    client.Connect(HOST, PORT);
                    connected = true;
                }
                catch (SocketException e)
                {
                   
                }                
            }
     }

我还建议从 client 的声明中删除 static