R语言httpuv包:HTTP与WebSocket server

Posted 技术直升机

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R语言httpuv包:HTTP与WebSocket server相关的知识,希望对你有一定的参考价值。


httpuv包为直接从R中处理HTTP和WebSocket请求提供了底层套接字和协议支持。它使用多线程体系结构,其中I/O在一个线程上处理,R回调在另一个线程上处理。


它主要是为其他包的构建模块,而不是使单独使用httpuv创建完整的web应用程序变得特别容易。httpuv构建在libuv和 http-parser的C语言库之上,这两个库都是由Joyent,Inc.开发的。


  • 基本使用


这是一个基本的web服务器,它在端口5000上侦听,并用包含当前系统时间和请求路径的网页响应HTTP请求:


library(httpuv)
s <- startServer(host = "0.0.0.0", port = 5000, app = list( call = function(req) { body <- paste0("Time: ", Sys.time(), "<br>Path requested: ", req$PATH_INFO) list( status = 200L, headers = list('Content-Type' = 'text/html'), body = body ) } ))


注意,当host的值为0.0.0.0时,它侦听所有网络接口。如果主机是127.0.0.1,它将只侦听来自本地主机的连接。


函数startServer()的作用是:获取一个app对象,它是一个命名列表,其中包含响应特定事件调用的函数。在上面的例子中,列表包含一个函数call。当服务器接收到完整的HTTP请求,并向其传递包含HTTP请求信息的环境对象req时,调用此函数。req$PATH_INFO是请求的路径(如果请求用于http://127.0.0.1:5000/foo,应该是“/foo”)。


函数call需要返回一个包含statusheaders body的列表list。该列表list将转换为HTTP响应并发送到客户端。


【R语言】httpuv包:HTTP与WebSocket server

【R语言】httpuv包:HTTP与WebSocket server

【R语言】httpuv包:HTTP与WebSocket server


要停止服务器:

s$stop()# 停止后上面的服务不再可用

或者,要停止所有正在运行的httpuv服务器:

stopAllServers()


  • 静态路径


httpuv服务器应用程序可以提供磁盘上的文件。这完全发生在I/O线程中,因此这样做不会被主R线程中的活动阻塞或阻止。


要提供路径,请在应用程序中使用staticPaths。这将把当前目录的www/子目录(从调用startServer开始)作为web路径的根目录:


首先需要在R的当前工作目录中创建www文件夹,在www文件夹中创建index.html文件:

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>Hello World!</title> </head> <body> <h1>Hello World!</h1> 王枫,你好! </body></html>


开启服务:

s <- startServer("0.0.0.0", path = 5000, app = list( staticPaths = list("/" = "www/") ))


【R语言】httpuv包:HTTP与WebSocket server


默认情况下,如果名为index.html索引存在于目录中,请求 将为其提供服务。


staticPaths 可以与 call 结合使用。在本例中,web路径 /assets 和 /lib 是从磁盘提供的,但是对任何其他路径的请求都通过 call 函数传递。


与上面创建www路径类似,在R语言当前工作目录中创建content文件夹,然后再content文件夹创建assets与lib文件夹,把index.html放在assets文件夹里面。然后启动服务:


s <- startServer("0.0.0.0", port = 5000, list( call = function(req) { list( status = 200L, headers = list( 'Content-Type' = 'text/html' ), body = "Hello world!" ) }, staticPaths = list( "/assets" = "content/assets/", # Don't use index.html for /lib "/lib" = staticPath("content/lib", indexhtml = FALSE) ) ))


【R语言】httpuv包:HTTP与WebSocket server

【R语言】httpuv包:HTTP与WebSocket server

【R语言】httpuv包:HTTP与WebSocket server

lib文件夹下无论有无index.html都会返回404状态,此时如果要访问lib下的index.html需要指定文件名:

【R语言】httpuv包:HTTP与WebSocket server


  • WebSocket server


httpuv还可以处理WebSocket连接。例如,此应用程序充当WebSocket 的echo服务器:


s <- startServer("127.0.0.1", 8080, list( onWSOpen = function(ws) { # The ws object is a WebSocket object cat("Server connection opened.
")
ws$onMessage(function(binary, message) { cat("Server received message:", message, " ") ws$send(message) }) ws$onClose(function() { cat("Server connection closed. ") }) } ))


要测试它,可以使用websocket包(它提供了一个websocket客户机)连接到它(当然还可以直接用web前端连接)。你可以从同一个R进程或者不同的R进程来操作。


library("websocket")
ws <- websocket::WebSocket$new("ws://127.0.0.1:8080/")
ws$onMessage(function(event) { cat("Client received message:", event$data, " ")})
# Wait for a moment before running next linews$send("hello world")
# Close clientws$close()


注意,httpuv和websocket包都提供了一个名为WebSocket的类;但是,在httpuv中,该类充当服务器;在websocket中,它充当客户机。它们也有不同的api。有关WebSocket客户端包"websocket"的更多信息,请参见下面链接:

https://github.com/rstudio/websocket


WebSocket案例操作如下图所示,下面的蓝色代码为server端,上面的红色代码为client端






小编:王枫


个人网站:


https://mapleeureka.github.io/index-ch.html




以上是关于R语言httpuv包:HTTP与WebSocket server的主要内容,如果未能解决你的问题,请参考以下文章

websocket协议详解与抓包分析

什么是webSocket?怎么使用webSocket中的第三方socket.io包

websocket协议详解与抓包分析

R语言基础:R与R包

如何安装Go语言安装包

R语言—简介安装包(package)的安装与加载