对于套接字连接,我是一个完整的新手,我正在尝试学习如何在R中使用它们。我正在尝试按照R文档中的“连接”示例。
但是,在Rstudio中运行以下命令(运行R 3.0)时:
con1 <- socketConnection(port = 6011, server = TRUE)
应用程序进入无限循环,我必须按停止按钮才能离开。结果我不能继续到示例的下一行
writeLines(LETTERS, con1)
close(con1)
有人可以解释我做错了吗?
答案 0 :(得分:5)
您尝试执行的示例需要两个R进程。您显示的代码将阻止(如您所见),直到另一个进程连接到它,指定相同的端口:
con2 <- socketConnection(Sys.info()["nodename"], port = 6011)
请注意,要使此代码生效,必须在与第一个进程相同的计算机上执行它,否则会引发错误。第二个进程执行后,第一个进程将解除阻塞,返回一个socketConnection
对象,然后您可以向其写入数据,这可以由第二个进程读取。
请注意,执行socketConnection
时,不会运行example(socketConnection)
手册页中的示例。如果是的话,它会像你看到的那样挂起你的R会话。
答案 1 :(得分:2)
tdsmith
freenode聊天室中的#R
给了我正确的建议:使用telnet
。
所以,终端窗口1:
R
s = socketConnection(port=12345, server=T)
R
现在应该挂起(等待某人与之交谈)。
现在打开另一个终端窗口并输入:
telnet localhost 12345
返回窗口1.您将看到R
不再挂起。好!所以现在输入(在同一窗口1中):
readChar(s,3)
返回窗口2,telnet
窗口。类型:
Lalas wins at life.
您在窗口1中看到的是,在窗口1的范围之外的某个地方输入的文本已进入窗口1.
Lal
不幸的是readChar
期待更短的消息,所以你没有得到整件事。再次尝试readChar(s,6)
,您就会听到
as win
。您会注意到readChar(s,1)
听到的字母似乎已经挂在那里&#34; (哪里?)。奇怪的。但显然这是一种讨厌的方式,不得不预先指定消息长度!
尝试不需要规范的readLines(s)
;它等待 EOL 字符。
返回窗口2,telnet窗口:
Money
that's what I want
that's what I waaaaaaaant
我想让readLines(s)
听到我的唯一方法是通过 Ctrl ] &#39;来telnet
获取提示然后close
。 R
无法听到所有这些换行符(即使您输入\r\n
等),但一旦连接关闭,您将获得窗口1中的每一行。
现在,这是在同一个freenode会议室中使用来自ernst
的更多帮助。这次使用telnet
而不是nc localhost 12345
。 Netcat可以听到和说话,并且表现得更好,因为我可以用 Ctrl D 发送 EOL 。
关闭并重新打开窗口1的套接字连接s = socketConnection(port=12345,server=T)
。关闭窗口2中的telnet
,然后键入nc localhost 12345
。现在在两边键入消息,它们可以相互接收。
窗口1:
cat( rpois(1e2, 20), file=s)
readLines(s)
窗口2(应该已经听过一些随机数字):
Lalas
wins
at
life.
{{control D}}
窗口1现在应该已收到消息。