Я довольно недавно работаю с сокетами, и я пытаюсь получить данные из оборудования 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 замерзает приложения после нескольких раз в цикле.
Похоже, ваше приложение достаточно простое, что использование NetworkStream и TcpClient обеспечивают слишком много функций. Было бы лучше «держать его простым». Попробуйте найти несколько примеров кода C#, который напрямую использует класс Socket, и читает ввод с использованием Socket.Receive(). – RenniePet
Вы проверили входящее соединение ??? Может ли клиентское приложение не отправлять какие-либо данные в поток? – rpc1
Я сделал несколько тестов в приложении winForm, где у меня есть datagridview для данных, и кажется, что приложение получает данные, но не добавлено в datagridview. Когда я использую счетчик для цикла, управление выполнением для заданного числа после этого, вся информация добавляется правильно в одно и то же время в datagridview. Поэтому я думаю, что моя проблема - это цикл. – user3317322