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

时间:2018-07-24 12:49:41

标签: r sockets multiple-instances

我在服务器端有一个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实例的持有吗? 祝福

1 个答案:

答案 0 :(得分:1)

如果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上打开一个简单的回显服务器。