KeyTo9_Fans 发表于 2017-3-1 00:28:17

如何搭建一个具有计算功能的网站服务器?

我想将实验室里的一台电脑作为网站服务器,实现以下功能:

$1$、在实验室里的任何一台电脑上打开浏览器,在地址栏里输入网站服务器的地址,网站服务器返回一个网页,网页上只有$1$个上传文件的按钮。

$2$、点击“上传文件”,弹出一个对话框,选择要上传的本地文件,点击“上传”。

$3$、网站服务器接收文件,然后运行一个C++程序,这个程序读取接收到的文件,经过短暂的计算之后,生成一个输出文件。

$4$、网站服务器返回一个网页,网页上只有$1$个下载文件的按钮。

$5$、点击“下载文件”,弹出一个对话框,选择要保存的位置,点击“保存”后,本机把网站服务器生成的输出文件下载到指定的位置。

如何实现以上功能?需要用到哪些软件?

#####

百度搜索“网站服务器”,很容易就能找到相关文献,例如:

http://jingyan.baidu.com/article/90895e0ff46c1464ec6b0b8b.html

但都没有提及第$3$步如何实现。

mathe 发表于 2017-3-1 06:43:34

你需要使用服务器端脚本,比如php就很好用

happysxyf 发表于 2017-3-1 09:08:49

自己写个CGI解释器就可以了,要把数据压缩、数据加密也考虑上。如果没有开发CGI的经验,那就只能用别人写的cgi去链接你的dll库。具体有些繁琐。

wayne 发表于 2017-3-1 20:37:44

用Jenkins吧,实现你的需求绰绰有余

KeyTo9_Fans 发表于 2017-3-2 23:49:13

我在本机安装了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:25:40

本帖最后由 happysxyf 于 2017-3-3 10:27 编辑

KeyTo9_Fans 发表于 2017-3-2 23:49
我在本机安装了apache,然后按照网上搜到的教程配置,然后运行:




不错,apache会注册为服务,每次开机都启动,会影响开机速度。

wayne 发表于 2017-3-3 17:59:32

KeyTo9_Fans 发表于 2017-3-2 23:49
我在本机安装了apache,然后按照网上搜到的教程配置,然后运行:




一定要严格的实现你列举的五个需求的话,考虑试试 最时髦的方案 nodejs,每提交一个请求,server就spawn一个子进程,编译,执行,并将结果write给浏览器。

mathe 发表于 2017-3-3 20:48:49

nodejs应该是个不错的选择。
不过我比较熟悉php,比如
http://www.w3school.com.cn/php/php_file_upload.asp
中给出如何处理文件上传,上传后可以得到一个临时文件,然后就可以通过
system()或exec()命令调用系统命令(比如这里需要编译程序并且运行)
最后只要输出html格式文件内容即可
当然通常需要下载文件应该在临时目录,通常无法直接下载,也可以通过php脚本下载
主要下载页面最好给出下载文件名字,MIME类型等:
http://www.jb51.net/article/30697.htm

wayne 发表于 2017-3-3 23:44:25

纯粹是玩玩,nodejs 做静态页面服务,提供文件上传,调用gcc编译程序,并运行二进制,输出运行结果,测试通过:

【神奇了,竟然不能上传截图】


wayne 发表于 2017-3-4 08:40:19

本人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
查看完整版本: 如何搭建一个具有计算功能的网站服务器?