11

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

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

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

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

writeLines(LETTERS, con1)
close(con1)

有人可以阐明我做错了什么吗?

4

2 回答 2

7

您尝试执行的示例需要两个 R 进程。您显示的代码将阻塞(如您所见),直到另一个进程连接到它,指定相同的端口:

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

请注意,要使此代码正常工作,您必须在与第一个进程相同的机器上执行它,否则会抛出错误。一旦第二个进程执行,第一个进程将解除阻塞,返回一个socketConnection对象,然后您可以向它写入数据,该数据可以被第二个进程读取。

请注意,socketConnection当您执行时,手册页中的示例不会运行example(socketConnection)。如果是,它会挂起您的 R 会话,如您所见。

于 2013-05-24T11:23:04.403 回答
4

Lalas,我也在尝试做你想做的事情,因为它对套接字完全一无所知。tdsmith#Rfreenode 聊天室里给了我正确的建议:使用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)听到的信件似乎一直“挂在那里”(在哪里?)。诡异的。但显然这是一种令人讨厌的收听方式,必须预先指定消息长度!


试试readLines(s)哪个不需要规范;它等待一个EOL字符。

回到窗口2,telnet窗口:

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

我能想到的唯一方法readLines(s)是听到我的声音Ctrl]telnet然后听到提示close音。R不会听到所有这些换行符(即使您键入\r\n等),但是一旦连接关闭,您将在窗口 1 中获得每一行。


现在这是ernst在同一个 freenode 房间中使用更多帮助。而不是使用telnet这个时间使用nc localhost 12345. Netcat 可以听和说,并且表现得更符合预期,因为我可以EOL使用CtrlD.

关闭并重新打开窗口 1 的套接字连接s = socketConnection(port=12345,server=T)telnet在窗口 2 中关闭,然后键入nc localhost 12345。现在在任一侧键入消息,它们可以相互接收。

窗口 1:

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

窗口 2(应该已经听到了一些随机数):

Lalas
wins
at
life.
{{control D}}

窗口 1 现在应该已经收到了消息。

于 2014-08-28T07:23:41.540 回答