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

时间:2017-02-13 15:52:26

标签: c# tcp tcpclient

我想看看C#中的TCP通信。我已经学习了使用Simple程序进行TCP接收和发送。但是我想更进一步。

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

我想做什么:

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

我提出的那种解决方案:

由于我想让我的程序非常灵活,我创建了一个用于处理通信的类,将它与程序代码的其余部分分开。

在这个类CommunicationTCP中,我创建了三个函数。

  1. 连接服务器
  2. 发送命令
  3. 从服务器接收答案
  4. 它看起来像什么

    .
    .
    .
    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连接保持打开状态并发送命令?

3 个答案:

答案 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类中的方法。

非常感谢我解决这个问题所需要的冲动!