Автор | Сообщение |
|
Отправлено: 11.04.19 09:36. Заголовок: C# и Websocket. Нужна помощь.
В C# пока полный 0, но изучать надо... Решил написать модуль для управления LG телевизора, работающий на Webos. Коммуникация ТВ осуществляется по Websocket на порт 3000. В библиотеках SIMPL# есть класс WebSocketClient, но мне показалось он несколько скуднее на методы, чем такой-же клас в библиотеках .NET. Ну да ладно, как я понимаю, сторонние библиотеки не прокатят и нужно пользоваться только теми, что описаны в SIMPL# (ну, кроме System, видимо). Написал клиентскую часть, соединение с сервером, получение клиентского ключа, сохранение ключа в файле, реализовал несколько команд управления. Работает! громкостью управляет, это уже хорошо, можно развивать дальше, но оказалось все не так просто. После простоя в минуту-две (отсутствие посылок клиент-сервер) сервер перестает отвечать на запросы, при этом метот Send(...) возвращает код WEBSOCKET_CLIENT_SUCCESS. Помогает только переподключение, т.е. нужно разорвать соединение и подключиться заново. За основу своего модуля брал простейший модуль написанный на JS, все сообщения соответствуют этому модулю. JS модуль работает в браузере без ограничения времени, поэтому предположу, что проблема не на стороне телеыизора. Но как ее найти, не понимаю... Может нужно делать асинхронное соединение? Но как это сделать методами SIMPL# так пока и не понял. Может кто сталкивался? Спасибо за любую помощь! PS. Еще заметил, что метод Read() выполняется бесконечно долго при отсутствии ответа от сервера. Может он имеет какие либо таймауты? Но я этого не нашел.
|
|
|
Ответов - 63
, стр:
1
2
3
4
All
[только новые]
|
|
|
Отправлено: 13.06.19 14:16. Заголовок: DmitriiP пишет: а п..
DmitriiP пишет: цитата: | а проверить receivedata на null что мешает :)??? |
| Да, собственно ничего не мешает, так и сделал. Сейчас проблема самоустранилась и все стабильно работает уже несколько дней, без исключений и receivedata равной null. Остался только вопрос, откуда там взялся null и, почему это произошло. Но, думаю, мы это не узнаем. Видимо какие-то внутренние процессы забывали ссылку на массив byte[]. Тут даже проблема не в обработке исключений или проверке на null, а в том, что просто в определенный момент переставал работать метод receive, отдавая reveivedata=null. Совсем... и дальнейшая работа над модулем переставала иметь смысл )))
|
|
|
|
Отправлено: 13.06.19 21:37. Заголовок: Paul_T пишет: Тут д..
Paul_T пишет: цитата: | Тут даже проблема не в обработке исключений или проверке на null, а в том, что просто в определенный момент переставал работать метод receive |
| Проблемма как раз именно в том что вы не обрабатываете исключения. null может приходить по разным причинам. но вы же не проверяете что :) if(receive_result == WebSocketClient.WEBSOCKET_RESULT_CODES. WEBSOCKET_CLIENT_SUCCESS) может быть другой статус "не зависящий от вашего кода", у которого по факту нету тела (оно null а не byte[] как при WEBSOCKET_CLIENT_SUCCESS) Перестваал работать он из за того что контроллер ловил системную ошибку и "вешал эту функцию". try/catch не прочто так придумали....
|
|
|
|
Отправлено: 13.06.19 22:28. Заголовок: DmitriiP пишет: ..
DmitriiP пишет: [quote]` Статус, как раз возвращался WEBSOCKET_CLIENT_SUCCESS, это и смутило... Ваша мысль ясна, буду знать. Пока только отладкой занимаюсь и все статусы и полученные данные пишу в консоль для контроля, видел, что receive выполняется с положительным результатом, однако, да, можно проверять полученные данные на их наличие. Обработку исключений допишу, конечно же ))) Кстати, в модуле к Denon Heos с апликейшн маркета, тоже исключения не все обработаны )
|
|
|
Ответов - 63
, стр:
1
2
3
4
All
[только новые]
|
|