2014-09-19 250 views
1

我正在嘗試將文本發送到服務器與R端口一起偵聽TCP端口,然後從服務器讀取響應文本。 很瑣碎的,即,在BASH爲服務器監聽端口12345,那就是:與TCP套接字(服務器)通信

> 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) 

現在,「結果」被打印到stdout,所以我不能捕捉它... 如果使用包含「文本」的臨時文件:

res <- readLines(pipe("nc localhost 12345 < tempfile")) 

這一工程,但需要一箇中間的臨時文件。 如何讓服務器通信在R中工作,以便我可以寫入然後從同一個連接讀取?

+0

請問socketConnection上的例子是否可以解決任何問題,例如,R進程2使用'isIncomplete()',也許在帶有'writeLines(「text」,con2)的readLines之前' – 2014-09-19 16:16:37

+0

不,我不想兩個R進程之間的通信;他們在那裏做的是等待「服務器」上的傳入數據。我的問題是首先發送:R似乎沒有發送我的請求,直到我手動關閉連接來刷新它。 – fnl 2014-09-19 18:19:03

回答

3

我編譯和運行這個simple server,導致

Socket created 
bind done 
Waiting for incoming connections... 

然後在RI創建連接

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 

然後退出,符合市場預期。不知道這與你嘗試過的有什麼不同。

+0

那麼,也許那麼服務器是問題,不知何故。我使用了一個名爲factorie的Scala包[http://factorie.cs.umass.edu/usersguide/UsersGuide200QuickStart.html]作爲服務器(「fac nlp」)。我認爲這是一個完善的圖書館,它不可能是問題! – fnl 2014-09-19 18:43:41

+0

只是爲了參考 - 確實存在一個問題,即Scala代碼的factorie。希望他們接受我的修復... – fnl 2014-09-22 12:36:56

相關問題