通过TCP套接字与服务器进行通信

3

我正在尝试使用R向监听TCP端口的服务器发送文本,然后从服务器读取响应文本。这很简单,例如,在Bash中,对于监听12345端口的服务器:

 > echo "text" | nc localhost 12345
 response

服务器会一直运行,并且在此之后可以随时查询。但是如果我使用socketConnection在R中尝试相同的操作,要么永远没有响应,要么打印出来但无法捕获。 我已经尝试过以下方法:
  con <- socketConnection(port=12345)
  con <- socketConnection(port=12345, blocking=TRUE, timeout=2)
  writeLines("text", con) # server does not receive a thing
  flush(con) # has no effect
  readLines(con) # still, nothing happens and gets nothing back
  close(con) # server confirms receipt, but I no longer can get the result...

服务器只有在关闭连接后才能接收数据,因此无法读取任何内容。
  con <- pipe("nc localhost 12345")
  writeLines("text", con)

现在,“result”被打印到标准输出,所以我无法捕获它... 如果使用一个包含“text”的临时文件:
  res <- readLines(pipe("nc localhost 12345 < tempfile"))

这样做可以实现功能,但需要一个中间的临时文件。 我该如何在R中使服务器通信工作,以便我可以从同一个连接写入并读取数据?


示例中的?socketConnection是否有所启示,例如R进程2使用isIncomplete(),可能需要在readLines之前加上writeLines("text", con2) - Martin Morgan
不,我并不是试图在两个R进程之间进行通信;他们在那里等待“服务器”上的传入数据。我的问题在于首先发送:R似乎无法发送我的请求,直到我手动关闭连接以刷新它。 - fnl
1个回答

5
我编译并运行了这个简单服务器,结果是:
Socket created
bind done
Waiting for incoming connections...

然后在R中创建了一个连接

con <- socketConnection("127.0.0.1", port = 8888)

服务器响应
Connection accepted

回到 R 中...

writeLines("all the world's a stage", con)
x = readLines(con)
x
## [1] "all the world's a stage"
close(con)

服务器响应如下:
Client disconnected

然后按预期退出。不确定这与您尝试的有何不同。


也许是服务器出了问题。我正在使用一个名为factorie的Scala包[http://factorie.cs.umass.edu/usersguide/UsersGuide200QuickStart.html]作为服务器(“fac nlp”)。我认为既然这是一个成熟的库,它不可能是问题所在! - fnl
仅供参考 - factorie 的 Scala 代码确实存在问题。希望他们能接受我的修复... - fnl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接