2017-02-13 3 views
0

Ich wollte einen Blick in die TCP-Kommunikation in C# werfen. Ich habe bereits mit einfachen Programmen zum Empfangen und Senden über TCP gelernt. Ich möchte jedoch noch einen Schritt weiter gehen.Zugriff auf eine TCP-Verbindung von der Funktion. C#

--EDIT: Die einfachen Programme haben alle gemeinsam, dass sie die TCP-Verbindung öffnen, senden oder empfangen und die Verbindung schließen. Bei Bedarf beginnen sie von vorne. Aber das ist nicht das, was ich für mein Programm vorhabe. EDIT--

Was ich tun möchte:

Ich habe ein Formular mit einer Schaltfläche, die eine Verbindung zu einem Server. (Der Server ist vorhanden und funktioniert ordnungsgemäß.) Nachdem die Verbindung hergestellt wurde, kann der Benutzer seine Befehle über eine Schaltfläche (Bytes) senden und erhält Antworten vom Server, die ihn in einem Etikett anzeigen.

Die Art der Lösung kam ich mit:

Da wollte ich mein Programm sehr flexibel ich eine Klasse machen geschaffen, um die Kommunikation für die Handhabung, vom Rest des Programmcodes zu trennen.

In dieser Klasse CommunicationTCP habe ich drei Funktionen erstellt.

  1. an den Server anschließen
  2. Senden Befehl
  3. Antwort vom Server empfangen

Das, was es sieht aus wie

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

Die Verbindungsfunktion, wenn in aufgerufen wird. Das Senden der Befehle, wie ich zu Beginn gesagt habe, wird vom Benutzer über Tasten gesendet.

Leider funktioniert der obige Code nicht, da die tcpclnt nur innerhalb ihrer Funktion verfügbar ist. Ich habe verschiedene Definitionen der Funktion und der Deklarationen ausprobiert, aber ohne Erfolg.

Wie kann ich das Programm so ändern, dass die TCP-Verbindung offen bleibt und die Befehle gesendet werden?

+0

Sie müssen dieselbe Instanz von 'TcpClient' für alle Ihre Funktionen verwenden. Machen Sie 'tcpclnt' zu einer Variablen auf Klassenebene anstelle einer lokalen Funktionsvariablen. – wablab

Antwort

0

Sie müssen Ihren TcpClient als Klassenvariable definieren. Das wird Ihre Probleme lösen:

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

Sie benötigen die tcpclnt Variable ein Mitglied Ihrer Klasse zu machen:

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); 
    } 
} 

So tcpclnt ist jetzt ein Mitglied der Klasse. Jede Instanz von CommunicationTCP hat ihre eigene tcpclnt. Und jede (Instanz-) Methode der Klasse kann auf diese Variable zugreifen. tcpclnt für alle Methoden in dieser Klasse zu machen, aber es gibt mir den Fehler

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

Loswerden der statischen Eigenschaft verschiebt das Problem nur in das Hauptprogramm

+0

Machen Sie im obigen Beispiel 'tcpclnt' statisch, wie in' static TcpClient tcpclnt; ', und dann wird alles funktionieren. – wablab

+0

@wablab danke, das habe ich verpasst. –

0

Ich habe bereits versucht, beiden Wege der Erklärung, in der Ich rufe die Funktionen an.

OK. Jetzt funktioniert es, seit ich eine neue Instanz der Kommunikationsklasse erstellt habe, die für alle Funktionen im Hauptprogramm verfügbar ist. Also kann ich damit die Methoden in der TCPcom-Klasse aufrufen.

Vielen Dank für die Impulse, die ich brauchte, um dieses Problem zu lösen!

Verwandte Themen