如何在R中使用svSocket服务器读取传入的消息

时间:2019-02-10 23:08:52

标签: r socketserver svsocket

我正在R中使用svSocket包来创建套接字服务器。我已经使用 startSocketServer(...)成功创建了服务器。我能够将我的应用程序连接到服务器,并将数据从服务器发送到应用程序。但是我正在努力阅读应用程序发送的消息。我在互联网上找不到任何示例。我在vsSocket的文档中只能找到 processSocket(...)示例(见下文),该示例描述了处理来自套接字的命令的函数。但是我只想读取重复发送到服务器的套接字消息,然后将它们打印在屏幕上进行测试。

## Not run: 
# ## A simple REPL (R eval/process loop) using basic features of processSocket()
# repl <- function ()
# {
#   pars <- parSocket("repl", "", bare = FALSE)  # Parameterize the loop
#   cat("Enter R code, hit <CTRL-C> or <ESC> to exit\n> ")   # First prompt
#   repeat {
#       entry <- readLines(n = 1)                # Read a line of entry
#       if (entry == "") entry <- "<<<esc>>>"    # Exit from multiline mode
#       cat(processSocket(entry, "repl", ""))    # Process the entry
#   }
# }
# repl()
# ## End(Not run)

输入谢谢。

编辑:

以下是套接字服务器创建和发送消息的更具体示例:

require(svSocket)

#start server
svSocket::startSocketServer(
  port = 9999,
  server.name = "test_server",
  procfun = processSocket,
  secure = FALSE,
  local = FALSE
)

#test calls
svSocket::getSocketClients(port = 9999) #ip and port of client connected
svSocket::getSocketClientsNames(port = 9999) #name of client connected
svSocket::getSocketServerName(port = 9999) #name of socket server given during creation
svSocket::getSocketServers() #server name and port

#send message to client
svSocket::sendSocketClients(
  text = "send this message to the client",
  sockets = svSocket::getSocketClientsNames(port = 9999),
  serverport = 9999
)

...,上面代码的响应是:

> require(svSocket)
> 
> #start server
> svSocket::startSocketServer(
+   port = 9999,
+   server.name = "test_server",
+   procfun = processSocket,
+   secure = FALSE,
+   local = FALSE
+ )
[1] TRUE
> 
> #test calls
> svSocket::getSocketClients(port = 9999) #ip and port of client connected
sock0000000005C576B0 
 "192.168.2.1:55427" 
> svSocket::getSocketClientsNames(port = 9999) #name of client connected
[1] "sock0000000005C576B0"
> svSocket::getSocketServerName(port = 9999) #name of socket server given during creation
[1] "test_server"
> svSocket::getSocketServers() #server name and port
test_server 
       9999 
> 
> #send message to client
> svSocket::sendSocketClients(
+   text = "send this message to the client",
+   sockets = svSocket::getSocketClientsNames(port = 9999),
+   serverport = 9999
+ )
> 

您可以看到的是:

  • 成功创建套接字服务器
  • 外部客户端sock0000000005C576B0(192.168.2.1:55427)成功连接到服务器
  • 成功地向客户端发送消息(此处控制台中未提供漏洞利用输出,但客户端会按等待状态做出反应
  • 我仍然无法实现的是获取发送到服务器的客户端消息。有人可以给我提供一个例子吗?

1 个答案:

答案 0 :(得分:1)

有关从客户端与服务器进行交互的信息,请参见?evalServer。

否则,您的processSocket()函数(默认函数或您提供的自定义函数)是服务器从一个连接的客户端获取某些数据时触发的入口点。从那里开始,您有两种可能:

  1. 最简单的方法就是使用默认的processSocket()函数。除了<<< >>>之间的一些特殊代码(它们被解释为特殊命令)之外,默认版本还将在服务器端评估R代码。因此,只需在服务器上调用所需的函数即可。例如,在服务器上定义f <-function(txt)paste(“ Fake process”,txt),然后在客户端上调用evalServer(con,“ f('some text')”)。您的自定义f()函数在服务器上执行。请注意,您需要在此处双引号包含文本的表达式。

  2. 另一种解决方案是定义您自己的processSocket()函数,以捕获客户端之前发送给服务器的消息。对于需要处理有限数量的消息类型而无需解析和评估从客户端接收到的R代码的服务器来说,这更安全。

现在,服务器是异步的,这意味着当服务器正在侦听客户端并处理其请求时,仍然可以在服务器上获得提示。