我想看看C#中的TCP通信。我已经学习了使用Simple程序进行TCP接收和发送。但是我想更进一步。
- 编辑:简单程序都有一个共同点,它们打开TCP连接,发送或接收并关闭连接。如果需要,他们会重新开始。但这不是我对我的计划的想法。编辑 -
我想做什么:
我有一个带有按钮的表单,用于建立与服务器的连接。 (服务器已经给出且工作正常。)建立连接后,用户可以通过按钮(字节)发送命令,并从服务器接收答案,并在标签中显示。
我提出的那种解决方案:
由于我想让我的程序非常灵活,我创建了一个用于处理通信的类,将它与程序代码的其余部分分开。
在这个类CommunicationTCP中,我创建了三个函数。
它看起来像什么
.
.
.
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
中调用connect函数。正如我在开头所说的那样,命令的发送是由用户通过按钮发送的。
遗憾的是,上面的代码不起作用,因为tcpclnt
仅在其功能中可用。我尝试了函数和声明的不同定义,但没有成功。
如何更改程序以便tcp连接保持打开状态并发送命令?
答案 0 :(得分:2)
您需要将tcpclnt
变量设为的成员:
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
现在是你班级的一员。 CommunicationTCP
的每个实例都有自己的tcpclnt
。并且类的每个(实例)方法都可以访问此变量。
答案 1 :(得分:0)
您必须将TcpClient定义为类变量。这将解决您的问题:
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);
}
答案 2 :(得分:0)
我已经尝试了两种声明方式,使tcpclnt可用于该类中的所有方法,但它返回错误
~R
摆脱静态属性只是将问题转移到我调用函数的主程序中。
行。现在它正在工作,因为我创建了一个新的通信类实例,可用于主程序中的所有功能。所以我可以用它来调用TCPcom类中的方法。
非常感谢我解决这个问题所需要的冲动!