Как читать входящие сообщения, используя svSocket Server в R

Я использую пакет svSocket в R для создания сервера сокетов. Я успешно создал сервер, используя startSocketServer (...). Я могу подключить свое приложение к серверу и отправить данные с сервера в приложение. Но я борюсь с чтением сообщений, отправленных приложением. Я не смог найти ни одного примера в интернете. Я нашел только пример processSocket(...) в документации по vsSocket (см. Ниже), которая описывает функцию, которая обрабатывает команду, поступающую из сокета. Но я хочу только прочитать сообщения сокета, поступающие на сервер в повторном блоке, и распечатать их на экране для тестирования.

## 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 ответ

Для взаимодействия с сервером на стороне клиента см.? EvalServer.

В противном случае именно ваша функция processSocket() (либо функция по умолчанию, либо предоставленная вами пользовательская функция) является точкой входа, которая запускается, когда сервер получает данные от одного подключенного клиента. Оттуда у вас есть две возможности:

  1. Самый простой - просто использовать функцию processSocket() по умолчанию. Помимо некоторого специального кода между <<<>>>, который интерпретируется как специальные команды, версия по умолчанию будет оценивать R-код на стороне сервера. Итак, просто вызовите нужную функцию на сервере. Например, определите f <- function (txt) paste ("Fake process", txt) на сервере и вызовите evalServer (con, "f ('some text')") на клиенте. Ваша пользовательская функция f () выполняется на сервере. Просто позаботьтесь о том, чтобы вам нужно было заключать в кавычки выражения, содержащие текст.

  2. Альтернативным решением является определение собственной функции processSocket() для захвата сообщений, отправленных клиентом на сервер ранее. Это безопаснее для сервера, которому необходимо обрабатывать ограниченное количество типов сообщений без анализа и оценки кода R, полученного от клиента.

Теперь сервер асинхронный, это означает, что вы все еще получили приглашение на сервере, пока он прослушивает клиентов и обрабатывает их запросы.

Другие вопросы по тегам