hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 474|回复: 9

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

[复制链接]

557

主题

557

帖子

1898

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1898
发表于 2023-9-25 16:37:20 | 显示全部楼层 |阅读模式
我想将实验室里的一台电脑作为网站服务器,实现以下功能:

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

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

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

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

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

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

#####

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

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

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

使用道具 举报

0

主题

201

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-25 16:37:48 | 显示全部楼层
你需要使用服务器端脚本,比如php就很好用
回复

使用道具 举报

0

主题

205

帖子

49

积分

新手上路

Rank: 1

积分
49
发表于 2023-9-25 16:38:32 | 显示全部楼层
自己写个CGI解释器就可以了,要把数据压缩、数据加密也考虑上。如果没有开发CGI的经验,那就只能用别人写的cgi去链接你的dll库。具体有些繁琐。
回复

使用道具 举报

0

主题

190

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-25 16:39:11 | 显示全部楼层
用Jenkins吧,实现你的需求绰绰有余
回复

使用道具 举报

0

主题

195

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-25 16:39:20 | 显示全部楼层
我在本机安装了apache,然后按照网上搜到的教程配置,然后运行:



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

接下来新建一个文本文件,写入如下html代码:
  1. <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程序:
  1. #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$个需求目前还不知道如何实现,我继续去网上搜搜,看看有没有相关资料。

本帖子中包含更多资源

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

x
回复

使用道具 举报

0

主题

171

帖子

36

积分

新手上路

Rank: 1

积分
36
发表于 2023-9-25 16:40:00 | 显示全部楼层
不错,apache会注册为服务,每次开机都启动,会影响开机速度。
回复

使用道具 举报

0

主题

190

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2023-9-25 16:40:34 | 显示全部楼层
一定要严格的实现你列举的五个需求的话,考虑试试 最时髦的方案 nodejs,每提交一个请求,server就spawn一个子进程,编译,执行,并将结果write给浏览器。
回复

使用道具 举报

0

主题

201

帖子

2

积分

新手上路

Rank: 1

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

使用道具 举报

0

主题

220

帖子

86

积分

关内侯

Rank: 2

积分
86
发表于 2023-9-25 16:41:42 | 显示全部楼层
纯粹是玩玩,nodejs 做静态页面服务,提供文件上传,调用gcc编译程序,并运行二进制,输出运行结果,测试通过:

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

使用道具 举报

0

主题

212

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-25 16:42:11 | 显示全部楼层
本人javascript不太会,nodejs也是现学现卖的,前端网页方面 也是菜鸟,前前后后 糊弄了一个小时的搞定,说明nodejs确实可行!





nodejs服务器的代码很简单,不到40行
  1. 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);
复制代码

本帖子中包含更多资源

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

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-11-22 21:22 , Processed in 0.088113 second(s), 23 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

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