2017-02-07 8 views
0

У меня есть решение с двумя проектами, которые действуют как сервер и клиент соответственно. Клиент - это простое консольное приложение, которое отправляет данные на сервер. Сервер представляет собой приложение WPF, которое получает данные и отображает их в datagrid. Здесь используется подход MVVM.C# Использование статических переменных в разных проектах

В интерфейсе сервера есть три текстовые поля, в котором пользователь может ввести в:

IP-адрес: ("127.0.0.1")

Порт: (некоторые порты)

разделители (некоторые символы, как «@», например)

задача для меня в этом, заключается в том, whate ver delimeter, который пользователь предоставляет, он должен использоваться в проекте клиента, который должен быть помещен между данными, которые должны быть отправлены. Например, клиент посылает:

Имя + разделитель + фамилия + разделители + Возраст

Что я пробовал:

Я добавил класс Utils со статическими полями для IPAddress, порт и разделители как это:

public class Utils 
{ 
    public static string IP_ADDRESS = " "; 
    public static int PORT = 0; 
    public static char DELIMETER = '\0'; 

} 

затем я попытался изменить эти значения в моем ViewModel, где соответствующие свойства, которые связаны с пользовательским интерфейсом являются по assignin г им:

private void storeData() 
{ 
    Utils.IP_ADDRESS = IP; 
    Utils.PORT = Port; 
    Utils.DELIMETER = Delimeter; 
} 

В клиентской программе:

static void Main(string[] args) 
    { 
     Client client = new Client(Utils.IP_ADDRESS, Utils.PORT); 

     while (true) 
     { 
      client.SendData("some Name" + Utils.DELIMETER + "some Surname" + Utils.DELIMETER + some Age + Utils.DELIMETER + "something else"); 
      Thread.Sleep(3000); 
     } 
    } 

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

Любая помощь приветствуется.

+0

Должно ли _client_ указывать информацию о соединении для установления соединения? В любом случае статические vars ограничены AppDomain, поэтому клиентский процесс будет иметь свои собственные копии статических свойств (поэтому они являются нулевыми). –

+0

Если сервер может изменить свои спецификации интеграции *, пока он работает *, то единственным способом для клиента получить обновленные спецификации будет запрос на сервер. Может быть, создать общую операцию, которую клиент может вызвать там, где сервер возвращает разделитель (и любые другие спецификации, которые могут понадобиться клиенту)? – David

+2

Вы должны использовать файл конфигурации и читать/записывать общие переменные (IP_ADDRESS, PORT, DELIMITER) из/в этот файл. –

ответ

1

Давайте разберем вашу проблему:

  1. Сервер может изменить IP или порты, по желанию, и клиенты будут как-то угадать новый порт и подключения.
  2. Сервер изменяет разделитель по желанию, и клиенты адаптируются к новому разделителю.

Проблема 1 невозможна. Информация не может волшебным образом передаваться клиентам до того, как клиент подключится к серверу, и клиенту необходимо, чтобы ip и порты подключались к серверу. Независимо от того, какой метод вы используете для передачи ip и порта клиенту, это лучший канал связи, чем ваш клиент/сервер, поэтому вам не нужен клиент/сервер.

Задача 2 has been solved by WCF already. Используйте WCF и SOAP или REST (это просто HTML).

Вот пример того, что код будет выглядеть для клиентов, чтобы определить разделитель перед отправкой основного запроса:

class Server 
{ 
    private TcpListener _listener = new TcpListener(12312);    
    public void Start() 
    { 
     _listener.Start(); 
     while (true) 
     { 
      var client = _listener.AcceptTcpClient(); 
      var stream = client.GetStream(); 
      var request = getRequest(stream); 
      if (request == "GetDelimiter") 
      { 
       SendResponse(Utils.DELIMITER, stream); 
      } 
      else 
      { 
       ProcessNameSurnameAge(request); 
      } 
     } 
    } 
} 

class Client 
{ 
    private TcpClient _client = new TcpClient(); 
    public void DoTheThing() 
    { 
     _client.Connect("127.0.0.1", 12312); 
     var stream = _client.GetStream(); 
     SendRequest("GetDelimiter", stream); 
     var delimiter = GetResponse(stream); 
     var newRequest = "some Name" + delimiter + "some Surname" + delimiter + "some Age" + delimiter + "something else"; 
     SendRequest(newRequest); 
    } 
} 

Заметьте, что я перескочить детали кодирования отправки данных через TCP потому что оно похоже, что вы уже справились с этим.

+0

Прежде всего, спасибо за ваш ответ и усилие. Во-вторых, он не намерен постоянно изменять значения ip-адреса, порта и делиметра при запуске приложения. Как только значения установлены, их не нужно изменять. Наконец, я никогда не использовал WCF раньше, и я ищу решение только с помощью WPF. –

+1

Я настоятельно рекомендую вам изучить WCF, как решение .Net для вашей проблемы. Вы изобретаете колесо. –

+1

Что касается ip и порта, сервер не может передавать эту информацию клиентам до подключения клиентов. Это невозможно с использованием TCP. –

0

Я смог решить это довольно простым способом. Шаги я, используемые для решения являются следующие:

На сервере:

  1. создал текстовый файл в моем решении.
  2. Когда сервер запускается в моей модели просмотра, я сохранил свойства ip, port и delimeter в массиве строк.
  3. Далее я использовал класс IO File для записи содержимого массива в текстовом файле.

В клиенте:

  1. Сначала я прочитал из файла.
  2. Затем я создал экземпляр клиента и передал ip и порт в качестве параметров его конструктору.

Спасибо D Stanley и Damian Galletini за ваши предложения. Также спасибо всем, кто пытался помочь.

+1

Вы используете файловую систему в качестве своего канала связи. Файловая система намного лучше, чем ваш клиентский сервер, поэтому вам не нужен клиентский сервер. –

+0

Согласовано, но назначение указывает, что tcp-связь между сервером и многими клиентами должна быть реализована. –

+0

Теперь я понимаю гораздо лучше. StackOverflow предназначен для решения реальных проблем. Это [политика сайта] (http://meta.stackoverflow.com/questions/334822/how-do-i-ask-and-answer-homework-questions), чтобы прямо указать, когда вопрос о домашнем задании, так как это обычно включает в себя произвольные ограничения, например ваши. –