我已经创建了一些网络应用程序,使用Rook
它可以在端口8000监听我的网络IP(192.168.xx.xx).我办公室内的每个人都可以http://192.168.xx.xx:8000/page_name
在浏览器中输入它们.我需要监控这些页面的使用情况,并想知道如何获取连接到它们的网络IP地址.
我在网络开发方面没有经验,而且从迄今为止所做的研究来看,使用客户端代码似乎JavaScript
很难(几乎不可能)实现这一点,(如果我错了,请纠正我).所以,我的问题是:有没有办法在Rook应用程序中使用服务器端代码获取网络客户端ip?(如果需要,我愿意更改网络服务器,任何解决方案都赞赏).
如果我的问题看起来令人困惑,请提前致谢和抱歉...特别是我不确定是否需要其他标签.
编辑:我也会接受使用不同于Rook
(但仍在R
)的东西的答案
编辑2:我在此链接后设置了Shiny Server .我正在配置服务器,以便获得access_log
它,根据@Thell,包含我需要的信息.在shiny-server.conf
我已经添加了相关声明,现在是:
run_as shiny;
server {
listen 3838;
location / {
site_dir /var/shiny-server/www;
log_dir /var/shiny-server/log;
directory_index on;
}
}
access_log /home/michelec/log.txt;
Run Code Online (Sandbox Code Playgroud)
最后一行应该告诉有光泽将access_log写入我的主文件夹.然而,没有任何事情发生,日志仍为空白.根据这里,在Formats部分,我应该收到以下日志之一:
default ':remote-addr - - [:date] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"'
short ':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms'
tiny ':method :url :status :res[content-length] - :response-time ms'
dev concise …
Run Code Online (Sandbox Code Playgroud) 我希望得到a startDate
和之间的日期顺序endDate
加1个月startDate
.即,如果startDate
是2013-01-31并且endDate
是2013-07-31,我希望看到这样的日期:
"2013-01-31""2013-02-28""2013-03-31""2013-04-30""2013-05-31""2013-06-30""2013-07-31"
我试过了 seq.Date(as.Date("2013-01-31"),by="month",length.out=7)
.但是这段代码的输出是这样的
> seq.Date(as.Date("2013-01-31"),by="month",length.out=7)
[1] "2013-01-31" "2013-03-03" "2013-03-31" "2013-05-01" "2013-05-31" "2013-07-01" "2013-07-31"
Run Code Online (Sandbox Code Playgroud)
那么,获得正确输出的最简单的解决方案是什么?
我在R中使用Rook创建了一个服务器 - http://cran.r-project.org/web/packages/Rook Code如下
#!/usr/bin/Rscript
library(Rook)
s <- Rhttpd$new()
s$add(
name="pingpong",
app=Rook::URLMap$new(
'/ping' = function(env){
req <- Rook::Request$new(env)
res <- Rook::Response$new()
res$write(sprintf('<h1><a href="%s">Pong</a></h1>',req$to_url("/pong")))
res$finish()
},
'/pong' = function(env){
req <- Rook::Request$new(env)
res <- Rook::Response$new()
res$write(sprintf('<h1><a href="%s">Ping</a></h1>',req$to_url("/ping")))
res$finish()
},
'/?' = function(env){
req <- Rook::Request$new(env)
res <- Rook::Response$new()
res$redirect(req$to_url('/pong'))
res$finish()
}
)
)
## Not run:
s$start(port=9000)
$ ./Rook.r
Loading required package: tools
Loading required package: methods
Loading required package: brew
starting httpd help server ... done
Server started on host …
Run Code Online (Sandbox Code Playgroud) HTML5规范允许一次上传多个文件<input type="file", ..., multiple="multiple">
.有没有办法利用Rook R包来利用这个?
这是我的尝试,但似乎只显示了一个选定的文件:
library(Rook)
app <- function(env) {
req <- Rook::Request$new(env)
res <- Rook::Response$new()
res$write(
'<html><body>
Select files:
<form method="POST" enctype="multipart/form-data">
<input type="file" name="data" multiple="multiple">
<input type="submit" name="Upload">
</form>
</body></html>')
if (!is.null(req$POST())){
data <- req$POST()[['data']]
res$write("<pre>")
res$write(paste(capture.output(req$POST(),file=NULL),collapse='\n'))
res$write("</pre>")
res$write("<pre>")
res$write(paste(capture.output(data$filename,file=NULL),collapse='\n'))
res$write("</pre>")
}
res$finish()
}
s <- Rhttpd$new()
s$add(app=RhttpdApp$new(name="app", app=app))
s$start(listen="127.0.0.1", quiet=FALSE)
s$browse(1)
#s$stop(); s$remove(all=TRUE); rm(s)
Run Code Online (Sandbox Code Playgroud) 在R functon中,我用作fileName
参数来读取和处理该文件中存在的csv数据.我使用rook
包来集成R和javascript.在javascript中,我使用以下代码来获取导入文件的文件名.
<form id='importPfForm'>
<input type='file' name='datafile' size='20'>
<input type='button' value='IMPORT' onclick='importPortfolioFunction()'/>
</form>
function importPortfolioFunction( arg ) {
var f = document.getElementById( 'importPfForm' );
var fileName= f.datafile.value;
$.ajax( {
type : "POST",
url : 'http://localhost:'+portNo+'/custom/Ralgotree/hBasedFileImport?fileName='+fileName,
dataType : "json",
data : '{ "method" : "hBasedFileImport", "clientId": "31d0c653-d7e5-44b6-98b5-8c084f99514a", "version": 0 }',
xhrFields: {
withCredentials: false
},
beforeSend : function(xhr) {},
success : function(data, textStatus, xmLHttpRequest){
},
error : function(xhr, ajaxOptions, thrownError) {
}
});
}
Run Code Online (Sandbox Code Playgroud)
因为这个方法只传递文件名而不是完整的文件路径,所以我不会在R中得到输出.所以我需要做什么修改来获得准确的输出.我使用以下R代码:
s <- …
Run Code Online (Sandbox Code Playgroud) 如何让R Rook网络服务器允许远程连接?
> library(Rook)
Loading required package: tools
Loading required package: brew
> s <- Rhttpd$new()
> s$start()
done
Server started on host 127.0.0.1 and port 18445 . App urls are:
http://127.0.0.1:18445/custom/RookTest
> s$browse(1)
Run Code Online (Sandbox Code Playgroud)
这在本地非常有效,但它不接受来自远程计算机的连接.
找到了解决办法:
使用s$start( listen = "77.77.66.77" )
的,而不是s$start()
在那里77.77.66.77
是你的电脑的IP地址(在网络上).
我正在尝试使用httpuv包构建一个简单的api。该文档说,可以使用相同的Rook定义。在使用Rook软件包时,可以简单地使用:
req$POST()
Run Code Online (Sandbox Code Playgroud)
我还无法弄清楚如何管理简单的HTTP POST请求并获得其主体。
有什么提示吗?
我想使用Rook构建一个简单的Web服务器,但是在R-Studio中尝试时我遇到了一些奇怪的错误:
代码
library(Rook)
s <- Rhttpd$new()
s$start()
print(s)
Run Code Online (Sandbox Code Playgroud)
返回相当无用的错误
"listenPort> 0时出错:比较(6)仅适用于原子和列表类型".
在简单的R-Console中尝试相同的代码时,一切正常 - 所以我想了解为什么会发生这种情况以及如何解决它.
RStudio版本为0.99.484,R为R 3.2.2
r ×8
ajax ×1
dataframe ×1
html5 ×1
ip-address ×1
ipv4 ×1
javascript ×1
shiny-server ×1
webserver ×1
xts ×1
zoo ×1