数学研发论坛

 找回密码
 欢迎注册
查看: 1457|回复: 12

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

[复制链接]
发表于 2017-3-1 00:28:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?欢迎注册

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

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

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

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

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

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

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

#####

百度搜索“网站服务器”,很容易就找到了$2$篇相关文献:

https://www.douban.com/note/197898730/

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

但都没有提及第$3$步如何实现。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-3-1 06:43:34 来自手机 | 显示全部楼层
你需要使用服务器端脚本,比如php就很好用
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-3-1 09:08:49 | 显示全部楼层
自己写个CGI解释器就可以了,要把数据压缩、数据加密也考虑上。如果没有开发CGI的经验,那就只能用别人写的cgi去链接你的dll库。具体有些繁琐。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-3-1 20:37:44 | 显示全部楼层
用Jenkins吧,实现你的需求绰绰有余
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-3-2 23:49:13 | 显示全部楼层
我在本机安装了apache,然后按照网上搜到的教程配置,然后运行:

apache.png

一个简易的网站服务器就搭好了。

接下来新建一个文本文件,写入如下html代码:

  1. <html><head><title>这是标题</title></head><body>
  2. <form enctype="multipart/form-data" action="/cgi-bin/post.cgi" method="post">
  3. <p>File: <input type="file" name="file1" /></p>
  4. <input type="submit" value="Submit" />
  5. </form></body></html>
复制代码


然后放到apache指定的文件夹里,重命名成“index.html”,网站主页就制作完成了。

然后在本机打开浏览器,在地址栏里输入“http://localhost/”,就出现以下网页:

page.png

这正是那$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程序:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. char c;
  4. int len;
  5. int main(){
  6.         printf("Content-Type:text/html\n\n<HTML><HEAD><TITLE >post Method</TITLE></HEAD><BODY>\n");
  7.         for(len=0;scanf("%c",&c)>0;len++)
  8.                 if(c==10)printf("<br>\n");
  9.                 else printf("%c",c);
  10.         printf("\n<br>\n一共接收到%d字节<br>\n",len);
  11.         printf("<input type="button" value="Back" onclick="javascript:window.location='../index.html'"></BODY></HTML>\n");
  12.         fflush(stdout);
  13.         return 0;
  14. }
复制代码


编译后出来一个post.exe文件,将其重命名为post.cgi,放到指定的“cgi-bin”文件夹里。

然后再次前往【http://localhost/】,选择“test.txt”文件,然后点击“Submit”,就出现了以下内容:

post.png

说明上传的文件已经成功接收,并且经过简单的计算,统计出收到的字节数为$197$。

于是楼主的第$3$个需求也实现了。

而楼主的最后$2$个需求目前还不知道如何实现,我继续去网上搜搜,看看有没有相关资料。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-3-3 10:25:40 | 显示全部楼层
本帖最后由 happysxyf 于 2017-3-3 10:27 编辑
KeyTo9_Fans 发表于 2017-3-2 23:49
我在本机安装了apache,然后按照网上搜到的教程配置,然后运行:


不错,apache会注册为服务,每次开机都启动,会影响开机速度。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-3-3 17:59:32 | 显示全部楼层
KeyTo9_Fans 发表于 2017-3-2 23:49
我在本机安装了apache,然后按照网上搜到的教程配置,然后运行:

一定要严格的实现你列举的五个需求的话,考虑试试 最时髦的方案 nodejs,每提交一个请求,server就spawn一个子进程,编译,执行,并将结果write给浏览器。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-3-3 23:44:25 | 显示全部楼层
纯粹是玩玩,nodejs 做静态页面服务,提供文件上传,调用gcc编译程序,并运行二进制,输出运行结果,测试通过:

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

demo.tar.gz (1.13 KB, 下载次数: 9)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-3-4 08:40:19 | 显示全部楼层
本人javascript不太会,nodejs也是现学现卖的,前端网页方面 也是菜鸟,前前后后 糊弄了一个小时的搞定,说明nodejs确实可行!


1234.png


nodejs服务器的代码很简单,不到40行

  1. var express = require('express');
  2. var app = express();
  3. var multer = require('multer');
  4. var upload = multer({ dest: 'upload' })
  5. var exec = require("child_process").exec;

  6. app.get('/', function(req, res) {
  7.    res.sendfile('./static/index.html');
  8. });

  9. app.post('/upload', upload.single('demo'), function(req, res){

  10.     var name = req.file.filename;
  11.     var cmd = 'gcc -x c ./upload/'+name+' -o '+name+' && ./'+name;
  12.     console.log(cmd);
  13.     exec(cmd, function (err, stdout, stderr) {
  14.         var ans;
  15.         if(err) {
  16.                 ans = 'compiler complains/runtime error';
  17.         } else
  18.                 ans = stdout;
  19.         //console.log(stderr);

  20.         console.log(ans);
  21.         res.writeHead(200, {"Content-Type": "text/plain"});
  22.         res.write(ans);
  23.         res.end();

  24.   });

  25. });

  26. app.listen(8888);

复制代码

demo.zip

1.62 KB, 下载次数: 4, 下载积分: 金币 -1 枚, 经验 1 点, 下载 1 次

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2019-2-17 18:17 , Processed in 0.066188 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表