我是靠谱客的博主 平淡睫毛,最近开发中收集的这篇文章主要介绍R 语言 |操作连接的函数 socketConnection 实现基于 socket 的 server/client 通信1.服务端2. 客户端3. 客户端函数24. 实现R版本的 http server // todorefer,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
一个简答的模型,测试R语言服务端-客户端通信模型。
测试机: ubuntu 20.04
R version: R4.1.1
1.服务端
server <- function(){
while(TRUE){
writeLines("Listening...")
con <- socketConnection(host="localhost", port = 6011, blocking=TRUE,
server=TRUE, open="r+")
# 读数据: 来自客户端
data <- readLines(con, 1)
# 输出数据
message("==>", data)
# 数据处理:变大写
response <- toupper(data)
# 数据写入: 回复给客户端点
writeLines(response, con)
close(con)
}
}
> server()
Listening...
2. 客户端
另开一个shell,打开R session:
send =function(text="hell", port=6011){
# 1.建立 socket 连接
con <- socketConnection(host="localhost", port = port, blocking=TRUE,
server=FALSE, open="r+")
sendme=text;
# 3.发送给服务端
write_resp <- writeLines(sendme, con)
# 4.从服务端接收消息
server_resp <- readLines(con, 1)
# 5. 打印该消息
print(paste("Your upper cased text: ", server_resp))
close(con)
}
> send('hi')
[1] "Your upper cased text: HI"
> send('hello, Tom')
[1] "Your upper cased text: HELLO, TOM"
同时服务端输出如下:
> server()
Listening...
==>hi
Listening...
==>hello, Tom
Listening...
3. 客户端函数2
还可以把客户端写到循环中:
client <- function(){
while(TRUE){
con <- socketConnection(host="localhost", port = 6011,
blocking=TRUE,server=FALSE, open="r+")
f <- file("stdin")
open(f)
print("Enter text to be upper-cased, q to quit")
sendme <- readLines(f, n=1)
if(tolower(sendme)=="q"){
break
}
write_resp <- writeLines(sendme, con)
server_resp <- readLines(con, 1)
print(paste("Your upper cased text: ", server_resp))
close(con)
}
}
> client()
[1] "Enter text to be upper-cased, q to quit"
hi
[1] "Your upper cased text: HI"
[1] "Enter text to be upper-cased, q to quit"
hello
[1] "Your upper cased text: HELLO"
[1] "Enter text to be upper-cased, q to quit"
Tom?
[1] "Your upper cased text: TOM?"
[1] "Enter text to be upper-cased, q to quit"
服务端输出:
> server()
Listening...
==>hi
Listening...
==>hello, Tom
Listening...
==>hi
Listening...
==>hello
Listening...
==>Tom?
Listening...
==>
Listening...
服务端关掉,客户端再发送会报错:
haha
[1] "Your upper cased text: "
Error in socketConnection(host = "localhost", port = 6011, blocking = TRUE, :
cannot open the connection
In addition: Warning message:
In socketConnection(host = "localhost", port = 6011, blocking = TRUE, :
localhost:6011 cannot be opened
4. 实现R版本的 http server // todo
有人借助 httpuv::startServer 实现了 http server: https://github.com/yihui/servr/blob/main/R/static.R
- 最小版怎么实现?可以用R或C++
- 支持 list 文件夹,支持range头
refer
- https://github.com/corynissen/r-socket-server
- https://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html
- https://stat.ethz.ch/R-manual/R-devel/library/utils/html/make.socket.html
最后
以上就是平淡睫毛为你收集整理的R 语言 |操作连接的函数 socketConnection 实现基于 socket 的 server/client 通信1.服务端2. 客户端3. 客户端函数24. 实现R版本的 http server // todorefer的全部内容,希望文章能够帮你解决R 语言 |操作连接的函数 socketConnection 实现基于 socket 的 server/client 通信1.服务端2. 客户端3. 客户端函数24. 实现R版本的 http server // todorefer所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复