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



我有一个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。因为没有客户端连接。但为了实现这一点,Node服务器应该首先运行正确吗?

我能够在一个基于控制台的应用程序中实现这一点,在主函数中,我在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方法上的Winform应用程序中复制相同的方法(其中方法在Class1.cs本身中定义(。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

相关内容

最新更新