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
。
我有一个 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
。