如何搭建一个具有计算功能的网站服务器?
我想将实验室里的一台电脑作为网站服务器,实现以下功能:$1$、在实验室里的任何一台电脑上打开浏览器,在地址栏里输入网站服务器的地址,网站服务器返回一个网页,网页上只有$1$个上传文件的按钮。
$2$、点击“上传文件”,弹出一个对话框,选择要上传的本地文件,点击“上传”。
$3$、网站服务器接收文件,然后运行一个C++程序,这个程序读取接收到的文件,经过短暂的计算之后,生成一个输出文件。
$4$、网站服务器返回一个网页,网页上只有$1$个下载文件的按钮。
$5$、点击“下载文件”,弹出一个对话框,选择要保存的位置,点击“保存”后,本机把网站服务器生成的输出文件下载到指定的位置。
如何实现以上功能?需要用到哪些软件?
#####
百度搜索“网站服务器”,很容易就能找到相关文献,例如:
http://jingyan.baidu.com/article/90895e0ff46c1464ec6b0b8b.html
但都没有提及第$3$步如何实现。
你需要使用服务器端脚本,比如php就很好用 自己写个CGI解释器就可以了,要把数据压缩、数据加密也考虑上。如果没有开发CGI的经验,那就只能用别人写的cgi去链接你的dll库。具体有些繁琐。 用Jenkins吧,实现你的需求绰绰有余 我在本机安装了apache,然后按照网上搜到的教程配置,然后运行:
一个简易的网站服务器就搭好了。
接下来新建一个文本文件,写入如下html代码:
<html><head><title>这是标题</title></head><body>
<form enctype="multipart/form-data" action="/cgi-bin/post.cgi" method="post">
<p>File: <input type="file" name="file1" /></p>
<input type="submit" value="Submit" />
</form></body></html>
然后放到apache指定的文件夹里,重命名成“index.html”,网站主页就制作完成了。
然后在本机打开浏览器,在地址栏里输入“http://localhost/”,就出现以下网页:
这正是那$5$行html代码对应的网页。
点击“选择文件”,确实会出现一个对话框,用于选定需要上传的文件。
于是楼主的前$2$个需求就实现了。
但是选定文件之后,点击“Submit”,会出现$404$错误:
——————————
Not Found
The requested URL /cgi-bin/post.cgi was not found on this server.
——————————
这是因为点击了“Submit”之后,服务器端要执行第$2$行html代码的这句话【action="/cgi-bin/post.cgi"】
而我们现在还没有这个文件,所以会报$404$错误。
为了生成这个文件,我用dev c++写了一个post.c程序:
#include<stdio.h>
#include<stdlib.h>
char c;
int len;
int main(){
printf("Content-Type:text/html\n\n<HTML><HEAD><TITLE >post Method</TITLE></HEAD><BODY>\n");
for(len=0;scanf("%c",&c)>0;len++)
if(c==10)printf("<br>\n");
else printf("%c",c);
printf("\n<br>\n一共接收到%d字节<br>\n",len);
printf("<input type=\"button\" value=\"Back\" onclick=\"javascript:window.location='../index.html'\"></BODY></HTML>\n");
fflush(stdout);
return 0;
}
编译后出来一个post.exe文件,将其重命名为post.cgi,放到指定的“cgi-bin”文件夹里。
然后再次前往【http://localhost/】,选择“test.txt”文件,然后点击“Submit”,就出现了以下内容:
说明上传的文件已经成功接收,并且经过简单的计算,统计出收到的字节数为$197$。
于是楼主的第$3$个需求也实现了。
而楼主的最后$2$个需求目前还不知道如何实现,我继续去网上搜搜,看看有没有相关资料。 本帖最后由 happysxyf 于 2017-3-3 10:27 编辑
KeyTo9_Fans 发表于 2017-3-2 23:49
我在本机安装了apache,然后按照网上搜到的教程配置,然后运行:
不错,apache会注册为服务,每次开机都启动,会影响开机速度。 KeyTo9_Fans 发表于 2017-3-2 23:49
我在本机安装了apache,然后按照网上搜到的教程配置,然后运行:
一定要严格的实现你列举的五个需求的话,考虑试试 最时髦的方案 nodejs,每提交一个请求,server就spawn一个子进程,编译,执行,并将结果write给浏览器。 nodejs应该是个不错的选择。
不过我比较熟悉php,比如
http://www.w3school.com.cn/php/php_file_upload.asp
中给出如何处理文件上传,上传后可以得到一个临时文件,然后就可以通过
system()或exec()命令调用系统命令(比如这里需要编译程序并且运行)
最后只要输出html格式文件内容即可
当然通常需要下载文件应该在临时目录,通常无法直接下载,也可以通过php脚本下载
主要下载页面最好给出下载文件名字,MIME类型等:
http://www.jb51.net/article/30697.htm 纯粹是玩玩,nodejs 做静态页面服务,提供文件上传,调用gcc编译程序,并运行二进制,输出运行结果,测试通过:
【神奇了,竟然不能上传截图】
本人javascript不太会,nodejs也是现学现卖的,前端网页方面 也是菜鸟,前前后后 糊弄了一个小时的搞定,说明nodejs确实可行!
nodejs服务器的代码很简单,不到40行
var express = require('express');
var app = express();
var multer = require('multer');
var upload = multer({ dest: 'upload' })
var exec = require("child_process").exec;
app.get('/', function(req, res) {
res.sendfile('./static/index.html');
});
app.post('/upload', upload.single('demo'), function(req, res){
var name = req.file.filename;
var cmd = 'gcc -x c ./upload/'+name+' -o '+name+' && ./'+name;
console.log(cmd);
exec(cmd, function (err, stdout, stderr) {
var ans;
if(err) {
ans = 'compiler complains/runtime error';
} else
ans = stdout;
//console.log(stderr);
console.log(ans);
res.writeHead(200, {"Content-Type": "text/plain"});
res.write(ans);
res.end();
});
});
app.listen(8888);
页:
[1]
2