我是靠谱客的博主 平淡睫毛,最近开发中收集的这篇文章主要介绍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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部