R打开套接字连接服务器并从一个脚本启动套接字连接客户端

R opening socket connection server and starting socket connection client from one script

我有一个来自服务器端的 R 代码:

socket.reader <- function(host="localhost", port=6011, time_freq){
  shell(paste("C:/Users/Stefan/source/repos/Quick-Check/Debug/Quick-Check.exe","COM3","127.0.0.1",port,time_freq))
  con <- socketConnection("localhost", port,server=TRUE, open="r+")
  txt <- readLines(con)
  close(con)
  return(txt)
}

observeEvent(input$socket_reader, {
 input<-socket.reader(time_freq=input$Samp_Freq*60)
 #tosave<-ts(as.numeric(input), frequency=200)
 write.csv(input,"C:/Users/Stefan/Documents/app/data/samplerun")
})

它应该启动套接字服务器,然后执行.exe 并读入.exe 发送到服务器的所有内容(exe 来自测量某些设备的cpp)。 问题是,一旦套接字连接在服务器端打开,r 进程似乎被阻塞并且不会计算 .exe,直到套接字再次超时关闭。我试图在服务器打开之前放置 .exe 并在 .exe 中放置 3 秒延迟,但似乎 .exe 启动,延迟,继续评估 r-server 套接字连接,这再次产生暂停直到超时。

有没有人知道如何从 R 中启动另一个进程以便同时评估两个进程或在打开套接字连接时取消保留 R 实例? 祝福

如果 wait = FALSE 在您的系统上工作,您可以在启动套接字服务器时指定该选项:

system2("nc", "-l -p 6011 -c /bin/cat", wait = FALSE)

con <- socketConnection(host="localhost", port = 6011, blocking=TRUE,
                        server=FALSE, open="r+")
write_resp <- writeLines("Hello, world!", con)
server_resp <- readLines(con, 1)
print(paste("Server response:  ", server_resp))
close(con)

或者您可以使用 future 包:

library(future)
plan(multiprocess)

server %<-% {
    system2("nc", "-l -p 6011 -c /bin/cat")
}

con <- socketConnection(host="localhost", port = 6011, blocking=TRUE,
                        server=FALSE, open="r+")
write_resp <- writeLines("Hello, world!", con)
server_resp <- readLines(con, 1)
print(paste("Server response:  ", server_resp))
close(con)

这里只有server声明为future,而客户端代码在父会话中执行。

注意:nc 命令只是在端口 6011 上打开一个简单的回显服务器。