R 语言 |操作连接的函数 socketConnection 实现基于 socket 的 server/client 通信

一个简答的模型,测试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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值