2017-02-13 3 views
0

Je voulais jeter un oeil sur la communication TCP en C#. J'ai déjà appris avec des programmes simples pour recevoir et envoyer via TCP. Cependant, je veux aller un peu plus loin. --EDIT: Les programmes simples ont tous un point commun: ouvrir la connexion TCP, envoyer ou recevoir et fermer la connexion. Si nécessaire, ils recommencent à zéro. Mais ce n'est pas ce que j'ai en tête pour mon programme. EDIT--Accès à une connexion TCP depuis la fonction. C#

Ce que je veux faire:

J'ai une forme avec un bouton qui établit une connexion à un serveur. (Le serveur est donné et fonctionne correctement.) Une fois la connexion établie, l'utilisateur peut envoyer ses commandes via un bouton (octets) et reçoit les réponses du serveur qui les affiche dans une étiquette.

Le genre de solution que je suis venu avec:

Depuis que je voulais faire mon programme très flexible, je créé une classe pour gérer la communication, la séparant du reste du code du programme.

Dans cette classe CommunicationTCP j'ai créé trois fonctions.

  1. Connexion au serveur
  2. Envoi commande
  3. de recevoir une réponse du serveur

Ce qu'il ressemble à ce qu'il

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

La fonction de connexion est appelée lorsque dans . L'envoi des commandes, comme je l'ai dit au début, est envoyé par l'utilisateur sur des boutons. Malheureusement, le code ci-dessus ne fonctionne pas car le tcpclnt n'est disponible que dans leur fonction. J'ai essayé différentes définitions de la fonction et des déclarations mais sans succès.

Comment puis-je modifier le programme afin que la connexion tcp reste ouverte et que les commandes soient envoyées?

+0

Vous devez utiliser la même instance de 'TcpClient' sur toutes vos fonctions. Faites du 'tcpclnt' une variable de niveau classe au lieu d'une variable de fonction locale. – wablab

Répondre

0

Vous devez définir votre TcpClient en tant que variable de classe. Cela permettra de résoudre vos problèmes:

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

Vous devez faire la variable tcpclnt un membre de votre classe:

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

Alors tcpclnt est maintenant membre de votre classe. Chaque instance de CommunicationTCP a son propre tcpclnt. Et chaque méthode (instance) de la classe peut accéder à cette variable.

+0

Rendre statique le 'tcpclnt' dans l'exemple ci-dessus, comme dans' static TcpClient tcpclnt; ', et tout fonctionnera. – wablab

+0

@wablab merci, j'ai raté ça. –

0

je l'ai déjà essayé les deux façons de déclaration à faire tcpclnt disponible pour toutes les méthodes de cette classe, mais il me renvoie l'erreur

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

Se débarrasser de la propriété statique déplace juste le problème dans le programme principal dans lequel J'appelle les fonctions.

OK. Maintenant, il fonctionne depuis que j'ai créé une nouvelle instance de la classe de communication qui est disponible pour toutes les fonctions dans le programme principal. Donc je peux utiliser ça pour appeler les méthodes de la classe TCPcom.

Merci beaucoup pour les impulsions dont j'avais besoin pour résoudre ce problème!