【发布时间】:2020-09-03 13:47:20
【问题描述】:
我正在尝试使用套接字在 R 会话之间进行通信,但无法让它们按照帮助文件的建议行事 (?read.socket)。
在一个 Rstudio 会话中,我运行以下命令
sock_server <- make.socket(port = 22222, server = TRUE)
write.socket(sock_server, "Ahoy-hoy")
然后在另一个我运行
sock <- make.socket(port = 22222, server = FALSE)
read.socket(sock, loop = FALSE)
我确实看到了友好的问候。
但是,如果我重新运行 read.socket 行而不发送任何其他内容,它就会挂起,只有在发送更多信息时才会返回。选项loop = FALSE 应该控制这种行为,如果没有任何内容等待读取,可能会返回一个空字符串,但它不会改变任何东西。
我在 MacOS 和 Windows 上都试过了,两种情况都一样。
知道如何让套接字正常运行吗?
我现在已经在命令行中尝试了 RStudio、RGui 和 R 的各种组合,就我所见,它在所有这些组合中的行为都是相同的。
我的最终目标是在 R 中拥有可以处理来自外部主机的 FIX 连接的东西。除了上述很难解决的问题外,它基本上可以使用这些套接字功能。
我愿意使用人们在这些事情上使用的任何其他东西。
这是第二次成功的尝试!但不幸的是,只有在 Mac 上,Windows 才会做一些奇怪的事情。
在基础 R 中使用二进制连接和一组不同的套接字函数,在服务器端你这样做
sock_server <- socketConnection(port = 22222, server = TRUE, open = 'a+b')
fix_message <- gsub("\\|","\001","8=FIX.4.4|9=106|35=0|34=1234|49=abc|56=def|10=999|")
writeBin(charToRaw(fix_message), sock_server)
在客户端
sock <- socketConnection(port = 22222, server = FALSE, open = 'a+b')
rawToChar(readBin(sock, raw(), n = 32))
请注意,我发送的消息中没有换行符(这是 FIX 消息的一个功能)。
在 Mac 上,这可以按预期工作 - 运行两次 readBin 行会为您提供整个消息,您可以将其粘贴回去,但在 Windows 上,消息的第二部分会消失!
# Mac
> rawToChar(readBin(sock, raw(), n = 32))
[1] "8=FIX.4.4\0019=106\00135=0\00134=1234\00149="
> rawToChar(readBin(sock, raw(), n = 32))
[1] "abc\00156=def\00110=999\001"
# Windows
> rawToChar(readBin(sock, raw(), n = 32))
[1] "8=FIX.4.4\0019=106\00135=0\00134=1234\00149="
> rawToChar(readBin(sock, raw(), n = 32))
[1] ""
我在两个平台上都使用 R 4.0.2。有人知道如何在 Windows 上执行此操作吗?
【问题讨论】:
-
只是猜测:这些套接字函数是否与 Rstudio 兼容?您是否尝试过运行两个 Rgui.exe 或两个终端会话来查看会发生什么?