2013-05-24 6 views
7

Sono un newbie completo quando si tratta di connessione socket, e sto cercando di imparare come usarli in R. Sto cercando di seguire l'esempio nella documentazione R per "connessioni".R - socketConnection

Tuttavia, quando eseguire il seguente comando nel Rstudio (in esecuzione R 3.0):

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

l'applicazione entra in un ciclo infinito, dove devo premere il pulsante di arresto di uscire. Come un risultato non posso continuare alla riga successiva dell'esempio

writeLines(LETTERS, con1) 
close(con1) 

qualcuno può fare luce a quello che sto facendo male?

risposta

5

L'esempio che si sta tentando di eseguire richiede due processi R. Il codice che si mostra possa bloccare (come avete visto) fino a quando un altro processo si collega ad esso, specificando la stessa porta:

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

Si noti che per questo codice per funzionare, è necessario eseguire sulla stessa macchina il primo processo, altrimenti genererà un errore. Una volta eseguito il secondo processo, il primo processo sarà sbloccando, restituendo un oggetto socketConnection e sarà quindi possibile scrivere dati che possono essere letti dal secondo processo.

Si noti che l'esempio dalla pagina man socketConnection non viene eseguito quando si esegue example(socketConnection). Se lo fosse, sarebbe appendere la tua sessione R come hai visto.

2

Lalas, sto anche cercando di fare quello che stai cercando di fare come un completo no-know alle prese. tdsmith nella chat di freenode mi ha dato il consiglio giusto: usare telnet.


Quindi, finestra del terminale 1:

R dovrebbe essere appeso ora (in attesa di qualcuno con cui parlare di esso).

Ora aprire un'altra finestra terminale e digitate:

telnet localhost 12345 

Torna alla finestra 1. Vedrete R non è appeso. Buona! Così ora digitare (nella stessa finestra 1):

readChar(s,3) 

Tornare alla finestra 2, la finestra telnet. Tipo: Finestra 1.

Lal 

Purtroppo readChar aspettava un messaggio più breve, in modo da

Lalas wins at life. 

Quello che vedrete nella finestra 1 è che il testo inserito da qualche parte al di là dei confini della finestra 1, è entrato non hai capito tutto. Prova readChar(s,6) di nuovo e sentirai

as win 

.Noterai che readChar(s,1) sente lettere che sembrano essere "appese lì" (dove?). Strano. Ma chiaramente questo è un modo fastidioso di ascoltare, dovendo precedere la lunghezza del messaggio!


Provare readLines(s) che non richiede la specifica; attende un carattere EOL.

Torna finestra 2, la finestra telnet:

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

L'unico modo che ho potuto capire per arrivare readLines(s) a sentire me era da Ctrl] 'ing in telnet per ottenere un prompt e poi close ing. R non date ascolto tutti questi ritorni a capo (anche se si digita \r\n, ecc), ma una volta che la connessione è chiusa si otterrà ogni riga nella finestra 1.


Ora, questo sta usando più aiuto dal ernst nel stessa stanza di Freenode. Invece di utilizzare telnet questa volta utilizzato nc localhost 12345. Netcat può ascoltare e parlare e si comporta in modo più prevedibile in quanto posso inviare EOL con CtrlD.

Chiudere e riaprire la connessione 1 della porta 1 s = socketConnection(port=12345,server=T). Chiudi telnet nella finestra 2 e digita invece nc localhost 12345. Ora digita i messaggi su entrambi i lati e possono essere ricevuti l'uno dall'altro.

finestra 1:

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

finestra 2 (dovrebbe avere già sentito alcuni numeri casuali):

Lalas 
wins 
at 
life. 
{{control D}} 

finestra 1 dovrebbe avere ora ha ricevuto il messaggio.