首页 > 解决方案 > 如何在 R 中使用 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
+ )
> 

你可以看到的是:

标签: rsocketserversvsocket

解决方案


有关从客户端与服务器的交互,请参阅 ?evalServer。

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

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

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

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


推荐阅读