在套接字连接方面,我是一个完整的新手,我正在尝试学习如何在 R 中使用它们。我正在尝试按照 R 文档中的“连接”示例进行操作。
但是,在 Rstudio(运行 R 3.0)中运行以下命令时:
con1 <- socketConnection(port = 6011, server = TRUE)
应用程序进入无限循环,我必须按下停止按钮才能退出。结果我无法继续到示例的下一行
writeLines(LETTERS, con1)
close(con1)
有人可以阐明我做错了什么吗?
在套接字连接方面,我是一个完整的新手,我正在尝试学习如何在 R 中使用它们。我正在尝试按照 R 文档中的“连接”示例进行操作。
但是,在 Rstudio(运行 R 3.0)中运行以下命令时:
con1 <- socketConnection(port = 6011, server = TRUE)
应用程序进入无限循环,我必须按下停止按钮才能退出。结果我无法继续到示例的下一行
writeLines(LETTERS, con1)
close(con1)
有人可以阐明我做错了什么吗?
您尝试执行的示例需要两个 R 进程。您显示的代码将阻塞(如您所见),直到另一个进程连接到它,指定相同的端口:
con2 <- socketConnection(Sys.info()["nodename"], port = 6011)
请注意,要使此代码正常工作,您必须在与第一个进程相同的机器上执行它,否则会抛出错误。一旦第二个进程执行,第一个进程将解除阻塞,返回一个socketConnection对象,然后您可以向它写入数据,该数据可以被第二个进程读取。
请注意,socketConnection当您执行时,手册页中的示例不会运行example(socketConnection)。如果是,它会挂起您的 R 会话,如您所见。
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 现在应该已经收到了消息。