2015-03-02 3 views
-2

Я довольно недавно работаю с сокетами, и я пытаюсь получить данные из оборудования RFID, у которого есть сырая потоковая передача на порте 1000. Нашел этот код, и я получил это, работая на консольном приложении с этим кодомtcpClient Подключение Удаленный хост замораживает приложение

TcpClient tcpClient; 
    NetworkStream networkStream; 
    tcpClient = new TcpClient("10.19.1.101", 10000); 
    networkStream = tcpClient.GetStream(); 
    StreamReader streamReader = new StreamReader(networkStream); 
    StreamWriter streamWriter = new StreamWriter(networkStream); 
    String wline = ""; 
    while (wline != "exit") 
    { 
     Console.Write(streamReader.ReadLine()); 
     Console.Write(Environment.NewLine); 
     Console.Write("next command:"); 
     wline = Console.ReadLine(); 
     streamWriter.Write(wline); 
    } 

Очевидно, что этот код ждет несколько команд, которые будут записаны в удаленном хосте, но мне не нужно ничего писать. Я просто пытаюсь получить информацию, отправленную оборудованием RFID, которое в основном является кодом метки RFID. Коды тегов могут поступать в произвольные периоды времени. Я фактически прокомментировал некоторые строки в предыдущем коде, и смог напечатать тег-коды, которые поступают в консоль.

TcpClient tcpClient; 
NetworkStream networkStream; 
tcpClient = new TcpClient("10.19.1.101", 10000); 
networkStream = tcpClient.GetStream(); 
StreamReader streamReader = new StreamReader(networkStream); 
//StreamWriter streamWriter = new StreamWriter(networkStream); 
String wline = ""; 
while (wline != "exit") 
{ 
    Console.Write(streamReader.ReadLine()); 
    Console.Write(Environment.NewLine); 
    //Console.Write("next command:"); 
    //wline = Console.ReadLine(); 
    //streamWriter.Write(wline); 
} 

Я не прав, потому что я не контролирую цикл while. Может ли кто-нибудь привести меня к правильному пути или подходу к решению моей «проблемы».

EDIT: Я изменил код и выглядит следующим образом:

 TcpClient tcpClient = new TcpClient("10.19.1.101", 10000); 
     NetworkStream networkStream = tcpClient.GetStream(); 
     StreamReader streamReader = new StreamReader(networkStream); 

     while (tcpClient.Connected) 
     { 
      Console.WriteLine(streamReader.ReadLine(); 
     } 

любопытной вещь, когда я делаю то же самое в приложении winFrom замерзает приложения после нескольких раз в цикле.

+0

Похоже, ваше приложение достаточно простое, что использование NetworkStream и TcpClient обеспечивают слишком много функций. Было бы лучше «держать его простым». Попробуйте найти несколько примеров кода C#, который напрямую использует класс Socket, и читает ввод с использованием Socket.Receive(). – RenniePet

+0

Вы проверили входящее соединение ??? Может ли клиентское приложение не отправлять какие-либо данные в поток? – rpc1

+0

Я сделал несколько тестов в приложении winForm, где у меня есть datagridview для данных, и кажется, что приложение получает данные, но не добавлено в datagridview. Когда я использую счетчик для цикла, управление выполнением для заданного числа после этого, вся информация добавляется правильно в одно и то же время в datagridview. Поэтому я думаю, что моя проблема - это цикл. – user3317322

ответ

0

Кажется, вы не обновляете wline до значений потока внутри цикла.

Смежные вопросы