2017-02-13 22 views
0

Я хотел посмотреть на TCP-связь на C#. Я уже учился с помощью простых программ для приема и отправки по TCP. Однако я хочу сделать еще один шаг.Доступ к одному TCP-соединению из функции. C#

-EDIT: простые программы имеют один общий вид, они открывают TCP-соединение, отправляют или получают и закрывают соединение. При необходимости они начинаются снова и снова. Но это не то, что я имею в виду для своей программы. EDIT--

Что я хочу сделать:

У меня есть форма с кнопкой, которая устанавливает соединение с сервером. (Сервер задан и работает правильно.) После установления соединения пользователь может отправлять свои команды с помощью кнопки (байты) и получать ответы от сервера, отображающего его на ярлыке.

Вид решение, которое я придумал:

Так как я хотел, чтобы моя программа очень гибкая я создал класс для обработки связи, отделяя его от остальной части кода программы.

В этом классе CommunicationTCP я создал три функции.

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

о соединении функция вызывается, когда в . Передача команд, как я сказал в начале, посылает пользователь через кнопки.

К сожалению, код выше не работает, потому что 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

Сделать статический файл 'tcpclnt' в приведенном выше примере, как в' static TcpClient tcpclnt; ', и тогда все будет работать. – wablab

+0

@wablab спасибо, я пропустил это. –

0

Я уже пробовал оба способа декларации сделать tcpclnt доступны для всех методов в этом классе, но он возвращает мне ошибку

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

Избавление от статического свойства просто сдвигает проблему в основную программу, в которой Я называю функции.

OK. Теперь он работает с момента создания нового экземпляра класса связи, который доступен для всех функций в основной программе. Поэтому я могу использовать это для вызова методов в классе TCPcom.

Большое спасибо за импульсы, которые мне нужны для решения этой проблемы!