从函数访问一个 TCP 连接。 C#

Accessing one TCP connection from function. C#

我想看看 C# 中的 TCP 通信。我已经学习了通过 TCP 接收和发送的简单程序。不过我想更进一步。

--编辑:简单程序都有一个共同点,它们打开 TCP 连接,发送或接收并关闭连接。如果需要,他们会重新开始。但这不是我对我的程序的想法。编辑--

我想做的事情:

我有一个带有按钮的表单,可以建立与服务器的连接。 (服务器已提供且工作正常。)建立连接后,用户可以通过按钮(字节)发送他的命令,并从服务器接收答案,并将其显示在标签中。

我想出的解决方案:

因为我想让我的程序非常灵活,所以我创建了一个 class 来处理通信,将它与程序代码的其余部分分开。

在这个classCommunicationTCP中我创建了三个函数。

  1. 正在连接到服务器
  2. 正在发送命令
  3. 正在从服务器接收答复

这就是它的样子

.
.
.
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.

中的方法

非常感谢你给我解决这个问题的动力!