2017-02-13 7 views
0

私はC#でTCP通信を調べたいと思っていました。私はすでにTCPを使って送受信するシンプルなプログラムで学んだ。しかし私は一歩進んで行きたい。機能からの1つのTCP接続へのアクセス。 C#

- EDIT:シンプルなプログラムはすべて共通の1つで、TCP接続を開いたり、接続を送受信したり閉じたりします。必要に応じて、彼らはもう一度始めます。しかし、これは私が自分のプログラムに留意したことではありません。私が何をしたいかEDIT--

私は、サーバーへの接続を確立し、ボタンでフォームを持っています。接続が確立された後、ユーザーはボタン(バイト)を介してコマンドを送信し、ラベルを表示しているサーバーから応答を受け取ることができます。

私が思いついた解決策の種類:私は、プログラムコードの残りの部分から分離、通信を処理するためのクラスを作成した私のプログラムは非常に柔軟にしたかったので

このクラスでは、CommunicationTCPに3つの機能を作成しました。

  1. サーバー

からの回答を受信するサーバ

  • 送信コマンド
  • に接続する。このことコネクト機能がにしたときに呼び出され
    . 
    . 
    . 
    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. 
        } 
        } 
    } 
    

    のようにそれが見えるもの。私が最初に言ったように、コマンドの送信はボタンを介してユーザーによって送信されます。

    悲しいことに、tcpclntはその機能内でのみ使用できるため、上記のコードは機能しません。私は関数と宣言の異なる定義を試しましたが、成功しませんでした。

    tcp接続が開いたままでコマンドが送信されるようにプログラムを変更するにはどうすればよいですか?

  • +0

    すべての機能で同じインスタンスの 'TcpClient'を使用する必要があります。 'tcpclnt'をローカル関数変数ではなくクラスレベルの変数にします。 – wablab

    答えて

    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

    あなたのクラスのメンバー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があります。そして、クラスの各(インスタンス)メソッドはこの変数にアクセスできます。

    +0

    上記の例で 'static TcpClient tcpclnt;'のように 'tcpclnt'を静的にすると、すべて動作します。 – wablab

    +0

    @wablabありがとう、私はそれを逃した。 –

    0

    私はすでにそのクラスのすべてのメソッドのtcpclntを利用できるようにする宣言の両方の方法を試してみましたが、それは誤り

    "An object reference is required for the non-static field, method, or property 'CommunicationTCP.tcpclnt'" 
    

    は、静的プロパティを退治するだけで、メインプログラムに問題をシフト私を返します。私は関数を呼び出します。

    OK。これは、メインプログラムのすべての機能で利用可能な通信クラスの新しいインスタンスを作成して以来、機能しています。だから私はそれを使用してTCPcomクラスのメソッドを呼び出すことができます。

    この問題を解決するために必要な衝動に感謝します。

    関連する問題