C # сетевое программирование - прослушивание - PullRequest
0 голосов
/ 17 января 2011

Я пишу клиент-серверное служебное приложение.Они общаются через TcpClient / Stream (клиент) и TcpListener / Socket (сервер).Я посылаю байты туда-сюда между этими двумя, затем я перехожу к той части, где у меня есть проблема;клиент отправляет сигнал на сервер (скажем, StartCounting).Клиент начинает делать некоторые вещи (скажем, считает с нуля).Сервер делает то же самое, как только получает StartCounting.Теперь, пока обе стороны считают, каждая сторона может прервать счет (скажем, нажав return).Когда одна сторона останавливается, она отправляет сообщение другой стороне для остановки.Вот несколько попыток кода (для клиента, но единственная разница в том, как они читают байтовый массив):

private void WaitForBye(object source, ElapsedEventArgs e)
{
    byte[] responseBytes = new byte[1000]; 
    int k = stream.Read(responseBytes, 0, 1000);
    String response = ASCIIEncoding.ASCII.GetString(responseBytes);
    response = response.Substring(0, k);

    String from, to, message;

    extractData(response, out message, out from, out to);

    Console.WriteLine(++counter);
    if (message == "BYE")
        isBye = true;
}

bTimer = new Timer();
bTimer.Elapsed += new ElapsedEventHandler(WaitForBye);
bTimer.Interval = 1000;
bTimer.Enabled = true;

Console.WriteLine("Press return when finished.");
while (Console.ReadLine() != "" && !isBye) ;

Как бы я это сделал?Желательно без использования потоков и с Timer вместо.

Ответы [ 2 ]

0 голосов
/ 17 января 2011

Вы можете сделать это с помощью stream.peek, чтобы проверить, есть ли данные для чтения.В противном случае ваш код будет ждать, пока появятся данные, и подсчет не будет работать.Помните, что прочитанное вами сообщение может быть неполным, поэтому не используйте этот подход в критических ситуациях.

Использование WCF сэкономит набор текста, но увеличит полезную нагрузку сообщений.* Сукчес.

0 голосов
/ 17 января 2011

Не думаю, что вы можете одновременно считать и слушать одну и ту же ветку, так что я думаю, вам придется изучить эту тему. C # 4.0 значительно облегчает работу с такими задачами.

Немного не по теме, но почему вы используете сокеты? Разве WCF не будет работать здесь нормально? Это спасло бы вас от набора текста.

Удачи,

GJ

...