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需要返回一个包含status
, headers
和 body
的列表list。该列表list将转换为HTTP响应并发送到客户端。
要停止服务器:
s$stop()
# 停止后上面的服务不再可用
或者,要停止所有正在运行的httpuv服务器:
stopAllServers()
静态路径
httpuv服务器应用程序可以提供磁盘上的文件。这完全发生在I/O线程中,因此这样做不会被主R线程中的活动阻塞或阻止。
要提供路径,请在应用程序中使用staticPaths。这将把当前目录的www/子目录(从调用startServer开始)作为web路径的根目录:
首先需要在R的当前工作目录中创建www文件夹,在www文件夹中创建index.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/")
)
)
默认情况下,如果名为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)
)
)
)
lib文件夹下无论有无index.html都会返回404状态,此时如果要访问lib下的index.html需要指定文件名:
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 line
ws$send("hello world")
# Close client
ws$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的主要内容,如果未能解决你的问题,请参考以下文章