从函数访问一个 TCP 连接。 C#
Accessing one TCP connection from function. C#
我想看看 C# 中的 TCP 通信。我已经学习了通过 TCP 接收和发送的简单程序。不过我想更进一步。
--编辑:简单程序都有一个共同点,它们打开 TCP 连接,发送或接收并关闭连接。如果需要,他们会重新开始。但这不是我对我的程序的想法。编辑--
我想做的事情:
我有一个带有按钮的表单,可以建立与服务器的连接。 (服务器已提供且工作正常。)建立连接后,用户可以通过按钮(字节)发送他的命令,并从服务器接收答案,并将其显示在标签中。
我想出的解决方案:
因为我想让我的程序非常灵活,所以我创建了一个 class 来处理通信,将它与程序代码的其余部分分开。
在这个classCommunicationTCP中我创建了三个函数。
- 正在连接到服务器
- 正在发送命令
- 正在从服务器接收答复
这就是它的样子
.
.
.
using System.Net.Sockets;
//eventually tried declarations like
//TcpClient tcpclnt;
//NetworkStream tcpStream;
namespace MyProgram
{
public partial class CommunicationTCP
{
public static void Connect()
{
TcpClient tcpclnt = new TcpClient();
tcpclnt.Connect(ServerIP,ServerPORT);
}
public static void TCPSendData()
{
TcpClient tcpclnt = new TcpClient();
NetworkStream netStream = tcpclnt.GetStream();
byte[] sendbytes = Encoding.UTF8.GetBytes("COMMAND");
netStream.Write(sendbytes, 0, sendbytes.Length);
}
public static void TCPGetData()
{
//not yet programmed.
}
}
}
在 Form_Load
时调用连接函数。命令的发送,就像我一开始说的,是由用户通过按钮发送的。
遗憾的是,上面的代码不起作用,因为 tcpclnt
仅在其函数中可用。我尝试了函数和声明的不同定义,但没有成功。
如何更改程序,使 tcp 连接保持打开状态并发送命令?
您必须将 TcpClient 定义为 class 变量。这将解决您的问题:
TcpClient tcpclnt = new TcpClient();
public static void Connect()
{
tcpclnt.Connect(ServerIP,ServerPORT);
}
public static void TCPSendData()
{
NetworkStream netStream = tcpclnt.GetStream();
byte[] sendbytes = Encoding.UTF8.GetBytes("COMMAND");
netStream.Write(sendbytes, 0, sendbytes.Length);
}
您需要使 tcpclnt
变量成为 class 的 成员:
public partial class CommunicationTCP
{
// declare member (field)
static TcpClient tcpclnt;
public static void Connect()
{
// use that field
tcpclnt = new TcpClient();
tcpclnt.Connect(ServerIP,ServerPORT);
}
public static void TCPSendData()
{
// check set the connection has been opened
if (tcpclnt == null)
throw new InvalidOperationException("You must open the connection before you can use it!");
NetworkStream netStream = tcpclnt.GetStream();
byte[] sendbytes = Encoding.UTF8.GetBytes("COMMAND");
netStream.Write(sendbytes, 0, sendbytes.Length);
}
}
因此 tcpclnt
现在是您 class 的成员。 CommunicationTCP
的每个实例都有自己的 tcpclnt
。 class 的每个(实例)方法都可以访问这个变量。
我已经尝试了两种声明方式以使 tcpclnt 可用于 class 中的所有方法,但它 returns 我的错误
"An object reference is required for the non-static field, method, or property 'CommunicationTCP.tcpclnt'"
摆脱静态 属性 只是将问题转移到我调用函数的主程序中。
好的。现在它正在工作,因为我创建了一个新的通信实例 class,它可用于主程序中的所有功能。所以我可以用它来调用 TCPcom-class.
中的方法
非常感谢你给我解决这个问题的动力!
我想看看 C# 中的 TCP 通信。我已经学习了通过 TCP 接收和发送的简单程序。不过我想更进一步。
--编辑:简单程序都有一个共同点,它们打开 TCP 连接,发送或接收并关闭连接。如果需要,他们会重新开始。但这不是我对我的程序的想法。编辑--
我想做的事情:
我有一个带有按钮的表单,可以建立与服务器的连接。 (服务器已提供且工作正常。)建立连接后,用户可以通过按钮(字节)发送他的命令,并从服务器接收答案,并将其显示在标签中。
我想出的解决方案:
因为我想让我的程序非常灵活,所以我创建了一个 class 来处理通信,将它与程序代码的其余部分分开。
在这个classCommunicationTCP中我创建了三个函数。
- 正在连接到服务器
- 正在发送命令
- 正在从服务器接收答复
这就是它的样子
.
.
.
using System.Net.Sockets;
//eventually tried declarations like
//TcpClient tcpclnt;
//NetworkStream tcpStream;
namespace MyProgram
{
public partial class CommunicationTCP
{
public static void Connect()
{
TcpClient tcpclnt = new TcpClient();
tcpclnt.Connect(ServerIP,ServerPORT);
}
public static void TCPSendData()
{
TcpClient tcpclnt = new TcpClient();
NetworkStream netStream = tcpclnt.GetStream();
byte[] sendbytes = Encoding.UTF8.GetBytes("COMMAND");
netStream.Write(sendbytes, 0, sendbytes.Length);
}
public static void TCPGetData()
{
//not yet programmed.
}
}
}
在 Form_Load
时调用连接函数。命令的发送,就像我一开始说的,是由用户通过按钮发送的。
遗憾的是,上面的代码不起作用,因为 tcpclnt
仅在其函数中可用。我尝试了函数和声明的不同定义,但没有成功。
如何更改程序,使 tcp 连接保持打开状态并发送命令?
您必须将 TcpClient 定义为 class 变量。这将解决您的问题:
TcpClient tcpclnt = new TcpClient();
public static void Connect()
{
tcpclnt.Connect(ServerIP,ServerPORT);
}
public static void TCPSendData()
{
NetworkStream netStream = tcpclnt.GetStream();
byte[] sendbytes = Encoding.UTF8.GetBytes("COMMAND");
netStream.Write(sendbytes, 0, sendbytes.Length);
}
您需要使 tcpclnt
变量成为 class 的 成员:
public partial class CommunicationTCP
{
// declare member (field)
static TcpClient tcpclnt;
public static void Connect()
{
// use that field
tcpclnt = new TcpClient();
tcpclnt.Connect(ServerIP,ServerPORT);
}
public static void TCPSendData()
{
// check set the connection has been opened
if (tcpclnt == null)
throw new InvalidOperationException("You must open the connection before you can use it!");
NetworkStream netStream = tcpclnt.GetStream();
byte[] sendbytes = Encoding.UTF8.GetBytes("COMMAND");
netStream.Write(sendbytes, 0, sendbytes.Length);
}
}
因此 tcpclnt
现在是您 class 的成员。 CommunicationTCP
的每个实例都有自己的 tcpclnt
。 class 的每个(实例)方法都可以访问这个变量。
我已经尝试了两种声明方式以使 tcpclnt 可用于 class 中的所有方法,但它 returns 我的错误
"An object reference is required for the non-static field, method, or property 'CommunicationTCP.tcpclnt'"
摆脱静态 属性 只是将问题转移到我调用函数的主程序中。
好的。现在它正在工作,因为我创建了一个新的通信实例 class,它可用于主程序中的所有功能。所以我可以用它来调用 TCPcom-class.
中的方法非常感谢你给我解决这个问题的动力!