2013-05-24 5 views
7

Jestem kompletnym nowicjuszem jeśli chodzi o połączenie z gniazdem i próbuję nauczyć się ich używać w R. Próbuję podążać za przykładem w dokumentacji R dla "połączeń".R - socketConnection

Jednak, gdy uruchom następujące polecenie w Rstudio (bieganie R 3.0):

con1 <- socketConnection(port = 6011, server = TRUE) 

aplikacja przechodzi w nieskończonej pętli, gdzie muszę nacisnąć przycisk Stop, aby wyjść. Jako wynik nie mogę przejść do następnej linii przykładu: Czy ktoś może rzucić trochę światła na to, co robię źle?

Odpowiedz

5

Przykład, który próbujesz wykonać, wymaga dwóch procesów R. Kod, który można pokazać zablokuje (jak widzieliście), aż inny proces łączy się z nim, podając ten sam port:

con2 <- socketConnection(Sys.info()["nodename"], port = 6011) 

pamiętać, że ten kod do pracy, należy wykonać go na tej samej maszynie co pierwszy proces, w przeciwnym razie spowoduje błąd. Po wykonaniu drugiego procesu pierwszy proces odblokuje , zwracając obiekt socketConnection, a następnie można zapisać do niego dane, które można odczytać w drugim procesie.

Należy zauważyć, że przykład ze strony podręcznika socketConnection nie jest uruchamiany po wykonaniu example(socketConnection). Gdyby tak było, zawiesiłby twoją sesję R, jak już widziałeś.

2

Lalas, próbuję również zrobić to, co próbujesz zrobić jako kompletną, nic nie wiedzącą. tdsmith na czacie freenode #R udzieliłem mi odpowiedniej porady: użyj telnet.


więc okno terminala 1:

R należy teraz wisi (czeka na kogoś, aby porozmawiać z nim).

teraz otworzyć kolejne okno terminala i wpisz:

telnet localhost 12345 

Wróć do okna 1. Zobaczysz R już nie wisi. Dobry! Więc teraz wpisać (w tym samym oknie 1):

readChar(s,3) 

Powrót do okna 2, okno telnet. Typ:

Lalas wins at life. 

Co zobaczysz w oknie 1 jest to, że tekst wprowadzony gdzieś poza granice okna 1, weszła okno 1.

Lal 

Niestety readChar spodziewałem krótszą wiadomość, więc nie dostałeś wszystkiego. Ponownie spróbuj readChar(s,6), a usłyszysz

as win 

.Zauważysz, że readChar(s,1) słyszy litery, które wydają się "wieszać" (gdzie?). Dziwne. Ale oczywiście jest to irytujący sposób na słuchanie, konieczność wcześniejszego określenia długości wiadomości!


Wypróbuj readLines(s), która nie wymaga specyfikacji; czeka na znak EOL.

Powrót do okna 2, okno telnet:

Money 
that's what I want 
that's what I waaaaaaaant 

Jedynym sposobem mogłem zorientować się dostać readLines(s) usłyszeć mnie było przez Ctrl] „ing w telnet aby uzyskać podpowiedź, a następnie close ing. R nie usłyszy te wszystkie nowe linie (nawet jeśli wpiszesz \r\n etc), ale gdy połączenie zostanie zamknięte dostaniesz każdy wiersz w oknie 1.


Teraz to jest za pomocą więcej pomocy od ernst w ten sam pokój freenode. Zamiast używać telnet tym razem używane nc localhost 12345. Netcat można słuchać i mówić, i zachowuje się bardziej expectedly że mogę wysłać EOL z CtrlD.

Zamknij i ponownie otwórz okno 1 gniazda gniazdka s = socketConnection(port=12345,server=T). Zamknij okno telnet w oknie 2 i wpisz zamiast niego: nc localhost 12345. Teraz wpisz wiadomości po obu stronach i mogą one być odbierane przez siebie nawzajem.

okno 1:

cat(rpois(1e2, 20), file=s) 
readLines(s) 

okno 2 (powinien już słyszałem kilka liczb losowych):

Lalas 
wins 
at 
life. 
{{control D}} 

okno 1 powinien mieć teraz otrzymaliśmy wiadomość.