Java课程设计博客(团队)
Java课程设计博客(团队)
1. 团队/项目名称
- 使用JAVA实现简易HTTP服务器
2. 团队成员
组长:林一心

组员:张杭镖

3. 项目git地址
https://github.com/orange666/HTTPServer/
4. 项目git提交记录截图

5. 项目功能架构图与主要功能流程图
(1)功能框架图

(2)功能流程图

6. 项目运行截图

7. 项目关键代码
private void doGet(DataInputStream in , OutputStream out, String reqLine) throws IOException{
String [] tokens = reqLine.split("\\s+"); //数组储存分隔符,正则表达式,\\s空格
String filePath = tokens[1]; //文件地址
String fileName = filePath; //文件名
/*
if(filePath.indexOf('?') != -1){ //是否包含键值对(?开头,URL规范)
String fileNm = fileName.substring(0,fileName.indexOf('?')); //判定url是否有键值对
String parameters = fileName.substring(fileName.indexOf('?')+1, fileName.length());//提取?以后键值对内容
String [] pars = parameters.split("&"); //分隔符
HashMap<String ,ArrayList<String>> parameterMap = new HashMap<String ,ArrayList<String>>();
for(String s : pars){
String[] kv = s.split("=");
String key = null;
String value = null;
if(kv.length == 2 ){
key = kv[0] ;
value = kv[1];
}else if(kv.length == 1 ){
key = kv[0] ;
value = "";
}else{
continue ;
}
ArrayList<String> values = parameterMap.get(key);
if(values == null){
values = new ArrayList<String>();
values.add(value);
parameterMap.put(key, values);
}else{
values.add(value);
}
}
fileName = fileNm;
doGetWithParameter( in , out, fileName , parameterMap);
return ;
}else{
if(fileName.endsWith("/")){
fileName += indexFileNname;//资源名
}
}
*/
if(fileName.endsWith("/")){
fileName += indexFileNname;//资源名
}
String contentTpye = URLConnection.getFileNameMap().getContentTypeFor(fileName);//判断需求类型,得到请求类型,比如图片、文字等
String version = null ; //版本号
if(tokens.length > 2){
version = tokens[2]; //提取版本号
}
Writer outPut = new OutputStreamWriter(out);
File theFile = new File(rootDirectory,fileName.substring(1, fileName.length())); //index文件名,从1即/开始
if(theFile.canRead() && theFile.getCanonicalPath().startsWith(rootDirectory.getPath())&& !theFile.isDirectory()){//判断是否只读/以已设置目录开头/是否合法路径
byte[] theData = Files.readAllBytes(theFile.toPath()); //字节数组,存文件内容
if(version.startsWith("HTTP/")){
senderHeader(outPut,"Http/1.0 200 OK",contentTpye,theData.length); //向客户端输出报文
}
out.write(theData);//111
out.flush();
}else{
String body = new StringBuilder("HTTP error 404 :File Not Found\r\n").toString();//
if(version.startsWith("HTTP/")){
senderHeader(outPut,"Http/1.0 404 File Not Found","text/html;charset=utf-8",body.length());
}
outPut.write(body);
outPut.flush();
}
}
private void doPost(DataInputStream in , OutputStream out, String reqLine) throws IOException{
String [] tokens = reqLine.split("\\s+");
String reqPath = tokens[1] ;
HashMap<String ,String> headers = new HashMap<String ,String>();
in.skip(1);
String theLine = in.readLine();
//System.out.println(theLine);
while (theLine != null) {
System.out.println(theLine);
if ("".equals(theLine)) {
break;
}
String [] headKV = theLine.split(": ");
headers.put(headKV[0], headKV[1]);
theLine = in.readLine();
//System.out.println("文字:"+theLine);
}
/*分析表单编码类型*、
Set<Entry<String, String>>entrys = headers.entrySet();
for(Entry<String, String> h : entrys){
if(h.getKey().equalsIgnoreCase("Content-Type")){
if(h.getValue().contains("application/x-www-form-urlencoded")){
doPostWithformUrlencoded( in , out , headers );
return ;
}else if(h.getValue().contains("multipart/form-data")){
//doPostWithMultiPart( in , out , headers );
return ;
}
}
}
Writer outPut = new OutputStreamWriter(out);
String body = new StringBuilder("HTTP error 501 :Not Implemented \r\n").toString();
String version = null ;
if(tokens.length > 2){
version = tokens[2];
}
if(version.startsWith("HTTP/")){
senderHeader(outPut,"Http/1.0 501 Not Implemented ","text/html;charset=utf-8",body.length());
}
outPut.write(body);
outPut.flush();
}
/*默认application/x-www-form-urlencoded */
void doPostWithformUrlencoded(DataInputStream in , OutputStream out ,HashMap<String ,String> headers ) throws IOException{
Writer outPut = new OutputStreamWriter(out);
int contentLength = 0 ;
Set<Entry<String, String>>entrys = headers.entrySet();
for(Entry<String, String> h : entrys){
if(h.getKey().equalsIgnoreCase("Content-Length")){
contentLength = Integer.parseInt(h.getValue());
break ;
}
}
if(contentLength != 0){
byte []bodyContent = new byte[contentLength];
int totalRed = 0 ;
int size = 0 ;
while(totalRed < contentLength){
size = in.read(bodyContent, totalRed, contentLength-totalRed) ;
totalRed += size;
}
String parameters = new String(bodyContent);
String [] pars = parameters.split("&");
HashMap<String ,ArrayList<String>> parameterMap = new HashMap<String ,ArrayList<String>>();
for(String s : pars){
String[] kv = s.split("=");
String key = null;
String value = null;
if(kv.length == 2 ){
key = kv[0] ;
value = kv[1];
}else if(kv.length == 1 ){
key = kv[0] ;
value = "";
}else{
continue ;
}
ArrayList<String> values = parameterMap.get(key);
if(values == null){
values = new ArrayList<String>();
values.add(value);
parameterMap.put(key, values);
}else{
values.add(value);
}
}
StringBuilder body = new StringBuilder();
body.append("<html><head><title>Test post with formUrlencoded</title></head><body><p>Post is ok</p></body></html>");
senderHeader(outPut,"Http/1.0 200 OK","text/html;charset=utf-8",body.length());
outPut.write(body.toString());
outPut.flush();
}
}
8. 尚待改进或者新的想法
上传文件及下载文件功能
9. 团队成员任务分配,团队成员课程设计博客链接
| 团队成员 | 任务分配 | 博客链接 |
|---|---|---|
| 林一心(组长) | 响应POST请求 | http://www.cnblogs.com/wkfg/p/7063085.html |
| 张杭镖 | 响应GET请求 | http://www.cnblogs.com/ghnb/p/7063321.html |
Java课程设计博客(团队)的更多相关文章
- Java课程设计——博客作业教学数据分析系统(201521123082 黄华林)
Java课程设计--博客作业教学数据分析系统(201521123082 黄华林) 一.团队课程设计博客链接 博客作业教学数据分析系统(From:网络五条狗) 二.个人负责模块或任务说明 1.网络爬虫 ...
- Java课程设计博客(个人)
Java课程设计博客(个人) 1. 团队课程设计博客链接 http://www.cnblogs.com/wkfg/p/7063081.html 2. 个人负责模块或任务说明 负责模块/任务:编写doG ...
- Java课程设计——博客作业教学数据分析系统(201521123084 林正晟)
#课程设计--博客作业教学数据分析系统(201521123084 林正晟) 1.团队课程设计博客链接 博客作业教学数据分析系统 2.个人负责模块或任务说明 学生登陆界面的前端实现和与数据库的连接 学生 ...
- Java课程设计——博客作业教学数据分析系统(201521123091 李嘉廉)
#课程设计--博客作业教学数据分析系统(201521123084 李嘉廉) 1.团队课程设计博客链接 博客作业教学数据分析系统 2.个人负责模块或任务说明 數據分析 Kmeans聚類算法實現 多元綫性 ...
- java课程设计——博客作业教学数据分析系统(201521123083 戴志斌)
目录 一.团队课程设计博客链接 二.个人负责模块或任务说明 三.自己的代码提交记录截图 四.自己负责模块或任务详细说明 五.课程设计感想 (题外话,终于可以用markdown建目录) 一.团队课程设计 ...
- JAVA课程设计+五子棋(团队博客)
JAVA课程设计 利用所学习的JAVA知识设计一个五子棋小游戏 1.团队名称.团队成员介绍(菜鸟三人组) 杨泽斌[组长]:201521123049 网络1512 叶文柠[组员]:20152112305 ...
- java课程设计-表达式运算(团队博客)
1 团队课程设计博客 1 团队名称.团队成员介绍 团队名称 奔跑吧土拨鼠 团队成员 洪亚文 201521123065 网络1513 郑晓丽 201521123066 网络1513 2 项目git地址 ...
- Java语言课程设计——博客作业教学数据分析系统(201521123107 张翔)
#Java语言课程设计--博客作业教学数据分析系统(个人博客) 1.团队课程设计博客链接 [博客作业教学数据分析系统(From:网络五条狗)](http://www.cnblogs.com/fanta ...
- Java课程设计-定时器(团队)
一.团队介绍(没头脑和不高兴) 陈文俊[组长] 201521123047 网络1512 宣委 郑子熙 201521123045 网络1512 二.项目Git链接 定时器 三.项目git提交记录截图 四 ...
随机推荐
- 研究分析JS中的三种逻辑语句
JS中的三种逻辑语句:顺序.分支和循环语句. 一.顺序语句 代码规范如下:1. <script type="text/javascript"> var a = 10; ...
- noip普及组2004 火星人
火星人 描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法.这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类 ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(五)用户接口层之提取媒体流数据
当RTSP客户端向RTSP服务端发送完PLAY命令后,RTSP服务端就会另外开启UDP端口(SDP协商定义的端口)发送RTP媒体流数据包.这些数据包之间会间隔一段时间(毫秒级)陆续被发送到RTSP客户 ...
- jenkins 从git拉取代码
步骤 jenkins已集成git插件(如无,请自行下载) 1. 去到源码管理栏,选中Git: 使用http协议去获取代码 Repository URL填写http的git地址,此时未选择相应的Cred ...
- java web轻量级开发面试教程读书笔记:建索引时我们需要权衡的因素
场景一,数据表规模不大,就几千行,即使不建索引,查询语句的返回时间也不长,这时建索引的意义就不大.当然,若就几千行,索引所占的空间也不多,所以这种情况下,顶多属于"性价比"不高. ...
- 关于CSS属性clip在手机浏览器端的兼容性问题
由于自己的6坏了拿去修了所以这两天使用了同事一只山寨安卓机和自己早年的小4,在今天的页面测试中,对于img中进行clip操作在这两台机子中均不能实现,后借用同事的6发现clip能正常展现,其中安卓版本 ...
- 【转载】webstorm11(注册,激活,破解,码,一起支持正版,最新可用)(2016.11.16更新)
很多人都发现 http://idea.lanyus.com/ 不能激活了 很多帖子说的 http://15.idea.lanyus.com/ 之类都用不了了 最近封的厉害仅作测试 选择 License ...
- Java入门(6)——集合、基本数据类型和引用数据类型的相互转换
集合: 1.HashMap ----> 类 概述: 通过key可以找到value, key就是键, values就是值. 俗称键值对. 特点: 无序的 值可以重复 键不可以重复的 如 ...
- The C++ Programming Language 学习笔记 第四章 类型和声明
1.关于main 函数中的 return 0 C99标准中,main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者(如操作系统).如果 main 函数的最后没有写 return ...
- shell之参数传递
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推-- 实例 以下实例我们向脚本传递三 ...