Я прочитал пару постов в SignalR и подумал о забавном тестовом проекте, в котором я мог бы создать веб-приложение для опроса моего получателя onkyo на предмет статуса и отображения результатов в браузере.Для первоначального теста мне удалось отправить клиенту текущее время на сервере, используя этот код в Application_Start:
ThreadPool.QueueUserWorkItem(_ =>
{
dynamic clients = Hub.GetClients<KudzuHub>();
while (true)
{
clients.addMessage(DateTime.Now.ToString());
Thread.Sleep(1000);
}
});
В клиентском JavaScript у меня есть следующий код:
// Proxy created on the fly
var kHub = $.connection.kudzuHub;
// Declare a function on the hub so that the server can invoke it
kHub.addMessage = function (message) {
console.log('message added');
$('#messages').append('<li>' + message + '</li>');
};
// start the connection
$.connection.hub.start();
Так что все это прекрасно работает.Каждую секунду я получаю новый элемент списка, содержащий текущую дату и время сервера.
Теперь, когда я добавляю этот код для чтения данных из приемника Onkyo, он прерывается: (все еще в Application_Start)
ThreadPool.QueueUserWorkItem(_ =>
{
dynamic clients = Hub.GetClients<KudzuHub>();
try
{
while (true)
{
string host = ConfigurationManager.AppSettings["receiverIP"].ToString();
int port = Convert.ToInt32(ConfigurationManager.AppSettings["receiverPort"]);
TcpClient tcpClient = new TcpClient(host, port);
NetworkStream clientSockStream = tcpClient.GetStream();
byte[] bytes = new byte[tcpClient.ReceiveBufferSize];
clientSockStream.Read(bytes, 0, (int)tcpClient.ReceiveBufferSize);
tcpClient.Close();
clients.addMessage(System.Text.Encoding.ASCII.GetString(bytes));
Thread.Sleep(50);
}
}
catch (SocketException ex)
{
// do something to handle the error
}
});
Я установил точку останова и прошел по коду.Он попадает в эту строку и затем возвращается.
clientSockStream.Read(bytes, 0, (int)tcpClient.ReceiveBufferSize);
Оставшаяся часть кода никогда не завершает отправку сообщения клиенту.Что я делаю неправильно?
Спасибо.