Komunikacja z urządzeniem przez TCP

Komunikacja z urządzeniem przez TCP
AM
  • Rejestracja:około 19 lat
  • Ostatnio:3 miesiące
0

Część,

Potrzebuję małej podpowiedzi.
Mam urządzenie które podłączone jest po LANie. Komunikacja protokół TCP.
Do niego mogę wysyłać dane, ale też dostaje informację zwrotną. I o ile pytanie/odpowiedź działa. To są sytuacje, gdy urządzenie samo od siebie może coś wysłać, jako informację o wystąpieniu zdarzenia.

Próbowałem to garnąć poprzez komponent TcpClient i TIdTCPClient. I mam problem z nasłuchem gdy ja nic nie muszę wysyłać, a na urządzeniu coś wystąpi i zwraca jakieś dane.

Kopiuj
TTcpClient.IOHandler.ReadStream( myInStream );

powoduje mi zamrożenie aplikacji, a chodzi mi o sprawdzenie czy są dane jeżeli tak to odczycie, a jeżeli nie ma to chciałbym wrócić do głównego zadania. Jak to ogarnąć? Z góry dzięki za podpowiedzi.

edytowany 1x, ostatnio: flowCRANE
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Poznań
  • Postów:8802
1

Pytanie, czy musisz działać w oparciu o Indy? Lepszą opcją jest Synapse - http://www.ararat.cz/synapse/doku.php/start. Wprawdzie nie rozwiązuje to wprost Twojego problemu, ale może być przydatną porada ;)


WL
Acha... A w czym jest to lepsza opcja?
cerrato
Bo jest bardziej dopracowana pod względem wieloplatformowosci od indy. Bo niczego nie trzeba instalować, wszystko się sprowadza do dodania odpowiedniego pliku do uses. Synapse działa synchronicznie.
cerrato
Synapse seems a bit harder than Indy for the firsts steps, but once you know your way, it's very reliable und does what you expect. Plus you have the good feeling of knowing what's going on, which is not always the case with Indy (at least for me).
WL
Cytujesz kogoś? Kogo i skąd?
cerrato
To był jakiś cytat z forum lazarusa. Niestety, żaden autorytet typu Bill Gates albo Bill Clinton, więc uznajmy, że go nie było. Za to wcześniejszy komentarz był mój.
KA
Indy jest nieporównywalnie lepsze od Synapse, którego jedyną zaletą wśród wielu wad jest mniejszy rozmiar oczywiście kosztem okrojonej funkcjonalności (np w HTTP do teraz nie zaimplementowano takich podstaw jak automatyczna obsługa przekierowań czy obsługa kompresji GZIP). Synapse bardziej dopracowane pod względem wielu platform od Indy? To naprawdę dobry żart dopiero niedawno w ogóle się za to zabrali.
cerrato
W temacie kompresji i Indy - cytat z wiki Lazarusa: "Currently Indy10 is nearly fully working, and end-user usability has been improved a lot. Only special topics like OpenSSL and compression might need additional knowledge"
KA
Nie wiem o jaką kompresje chodzi, być może o zabawę we własna obsługę nietypowego formatu ale GZip i Deflate załatwia dołączenie TIdCompressorZLib. Oczywiście z OpenSSL też nie ma najmniejszych problemów wiec nie wiem czy to pisał ktoś totalnie niekompetentny czy co.
PW
  • Rejestracja:ponad 9 lat
  • Ostatnio:5 miesięcy
  • Postów:130
1

Ja ze swojej strony mogę polecić ICS overbyte znacznie więcej możliwości konfiguracji stosu tcp i super stabilne i przewidywalne.
Synapse też są bardzo dobre.

KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Gorlice
2

Jeżeli chodzi o rozwiązanie na TIdTCPClient to wątek w nim pętla while not Terminated do tam sprawdzasz czy masz coś do odczytania czyli IdTCPClient1.IOHandler.InputBuffer.Size > 0 Jak są dane to odczytujesz także w wątku możesz tam sobie zsynchronizować jakieś zdarzenie tylko oczywiście przez tradycyjne Synchronize albo TThread.Queue(nil, procedure begin {tu wywołujesz zdarzenie} end);. Żadna filozofia.


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
SP
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 2 lata
  • Postów:127
0
amidar napisał(a):

(...)
powoduje mi zamrożenie aplikacji, a chodzi mi o sprawdzenie czy są dane jeżeli tak to odczycie, a jeżeli nie ma to chciałbym wrócić do głównego zadania. Jak to ogarnąć? Z góry dzięki za podpowiedzi.

Jeśli tak, to musisz ustawić gniazdo na pracę w trybie nieblokującym

Zobacz pozostały 1 komentarz
SP
@wloochacz: tak ogólnie pisałem, nie wiedziałem że w Indy się nie da, prawdę mówiąc pierwszy raz słyszę tę nazwę :P
WL
KA
Pierwszy raz słyszysz o Indy? :P
SP
@wloochacz: @karpov ja w ogóle nie znam Delphi :P potraktowałem radę z nieblokującymi socketami jako niezależną od języka ale nie wiedziałem że ta konkretna biblioteka nie wystawia API do ich obsługi. Zostawmy to już :)
KA
Spoko luz, nabijamy się tylko ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.