Как читать входящие сообщения, используя svSocket Server в R - PullRequest
0 голосов
/ 11 февраля 2019

Я использую пакет 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) к серверу
  • успешная отправка сообщенияклиенту (здесь вывод explizit не предоставляется в консоли, но клиент реагирует так, как ожидается
  • , что я до сих пор не могу реализовать, это получить клиентские сообщения, отправленные на сервер. Может ли кто-нибудь предоставить мнепример на что?

1 Ответ

0 голосов
/ 27 февраля 2019

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

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

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

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

Теперь сервер асинхронный, что означает, что вы по-прежнемуполучил запрос, доступный на сервере, в то время как он слушает клиентов и обрабатывает их запросы.

...