R - socketConnection

时间:2013-05-24 01:40:16

标签: r

对于套接字连接,我是一个完整的新手,我正在尝试学习如何在R中使用它们。我正在尝试按照R文档中的“连接”示例。

但是,在Rstudio中运行以下命令(运行R 3.0)时:

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

应用程序进入无限循环,我必须按停止按钮才能离开。结果我不能继续到示例的下一行

writeLines(LETTERS, con1)
close(con1)

有人可以解释我做错了吗?

2 个答案:

答案 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获取提示然后closeR无法听到所有这些换行符(即使您输入\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现在应该已收到消息。