2012-10-09 23 views
9

Próbuję napisać bardzo prosty program w gnieździe, czego zasadniczo potrzebuję, aby klient nasłuchiwał komunikacji z serwera w pętli while (true). teraz chcę również, aby klient mógł przesłać niektóre dane z powrotem na serwer w trakcie słuchania.Równoczesne odczytywanie i zapisywanie gniazd

Jedyne rozwiązanie, jakie mogę wymyślić, to utworzenie wątku do odczytu i zapisu oraz przerwanie przeczytanego wątku za każdym razem, gdy muszę napisać.

istnieje lepsze rozwiązanie, czy jest to jedyny sposób mogę to zrobić

+1

Edytuj swój wpis, aby podać więcej informacji o swojej pracy. Co próbujesz? Jakie badania wykonałeś? Który kod nie działa? – Gray

+1

To po prostu nie problem - patrz odpowiedź @CrazyCasta. Strumienie Tx/rx są niezależne i odczytywane z jednego wątku, podczas gdy zapis z innego jest w porządku. –

+0

R/W jednocześnie jest definicją Full-duplex, która jest TCP. – irreputable

Odpowiedz

6

Można używać dwóch wątków. Jeden do czytania i drugi do pisania. W ten sposób wątek zapisu może pisać w dowolnym momencie (nie trzeba przerwać czytania).

Innym sposobem na to jest użycie setSoTimeout(timeoutMs) na gnieździe przed wywołaniem odczytu. Spowoduje to, że wyrzuci on SocketTimeoutException, jeśli odczyt zajmie więcej czasu niż miliony sekund, pozwalając na pisanie, jak chcesz.

+1

Zgodziłbym się na to oprócz części timeout. Dlaczego chcesz tego? Możesz napisać mimo to. –

+0

@TobiasRitzau Umożliwia użycie jednego wątku zamiast dwóch. Nie jestem do końca pewien, co OP robi, więc dodałem tylko inną opcję. – CrazyCasta

+2

Istnieje kilka poważnych problemów z synchronizacją, które mogą z tego wyniknąć. A jeśli skończysz, gniazdo jest zamknięte, czy coś mi brakuje? –

-1

Można użyć dwóch różnych portów, jednego do słuchania i jednego do pisania. i używaj różnych wątków do wykonywania operacji, wtedy twoja pętla (prawda) nie stworzy problemu.

+2

To właśnie robi gniazdo ... Obsługuje już pełny dupleks. –

0

Spójrz na specyfikacje protokołu FTP. Robi to, co zamierzasz, używając dwóch gniazd/kanałów, jednego dla poleceń i jednego dla danych.

+1

To nie jest potrzebne. Jedno gniazdo wystarcza do wysłania i odebrania na dwóch oddzielnych kanałach. –

Powiązane problemy