package com.day3;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class Server { /**刘诗华
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//换行符
String CRLF="\r\n"; //绑定本机8080端口
ServerSocket server=new ServerSocket(8080);
//开始接受服务器
Socket socket = server.accept();
//获取输入流
InputStream in = socket.getInputStream();
//用于接受浏览器的Request请求报文内容
byte[] buffer=new byte[20480]; int len = in.read(buffer);
//将字节数组转换成字符串对象
String s = new String(buffer); //获取http请求方式
int endIndex=s.indexOf(CRLF);
String firstTr=s.substring(0, endIndex); // 第一行 GET /default.jsp?userid=100&pwd=123456 HTTP/1.1
endIndex=firstTr.indexOf("/"); // 从第一行中获取第一个 /线
String method=firstTr.substring(0, endIndex).trim(); //获取请求url地址
int beginIndex=endIndex+1; // 从第一个 /线位置
endIndex=firstTr.indexOf("HTTP"); // 第一行的 HTTP位置
String url=firstTr.substring(beginIndex, endIndex); //请求参数字符串
StringBuilder paramString=new StringBuilder(); //如果浏览器是GET方式请求
if(method.equalsIgnoreCase("get"))
{
//判断是否有带参数,如果有,则做截取,存放于变量paramString字符串当中
if(firstTr.contains("?"))
{
int i=firstTr.indexOf("?")+1;
paramString.append(firstTr.substring(i, endIndex));
}
} //如果是POST请求,则请求参数的位置是最后一个换行符的位置开始到报文的最后
if(method.equalsIgnoreCase("post"))
{
int lastIndex=s.lastIndexOf(CRLF);
paramString.append(s.substring(lastIndex));
} //定义一个Map集合用于存储请求参数  键:String 值:List
//因为我们在前端写表单的时候,可能会有多个 name一样
//这里我们就要采用一个ArrayList单列集合来存放数据 如 fav=1&fav=2&fav=3
Map<String, List<String>> parameterMap=new HashMap<String, List<String>>(); //以&符号进行切割请求参数,得到一个字符串数组对象
String[] keyValues = paramString.toString().split("&"); //关闭资源
in.close();
socket.close();
server.close(); //遍历请求参数数组
for (String attr : keyValues) {
//以=符做为切割符
String[] arr = attr.split("=");
//键
String key=arr[0].trim();
//值
String value=arr[1].trim(); //假设Map集合当中没有key的数据,则添加一个
if(!parameterMap.containsKey(key))
{
List<String> list=new ArrayList<String>();
parameterMap.put(key, list);
}
//通过key获取list对象
List<String> list = parameterMap.get(key);
//将内容值存放于ArrayList数组
list.add(value);
} System.out.println("员工姓名:"+parameterMap.get("uname"));
System.out.println("手机号码:"+parameterMap.get("tel"));
System.out.println("个人爱好:"+parameterMap.get("fav"));
System.out.println("提交按键:"+parameterMap.get("but")); // 打印结果
// 员工姓名:[lsh]
// 手机号码:[15390725037]
// 个人爱好:[1, 3]
// 提交按键:[ok] } }

01-简单编写http服务器的更多相关文章

  1. 实战WEB 服务器(JAVA编写WEB服务器)

    实战WEB 服务器(JAVA编写WEB服务器) 标签: web服务服务器javawebsockethttp服务器 2010-04-21 17:09 11631人阅读 评论(24) 收藏 举报  分类: ...

  2. MQTT协议的简单介绍和服务器的安装

    最近公司做的项目中有用到消息推送,经过多方面的筛选之后确定了使用MQTT协议,相对于XMPP,MQTT更加轻量级,并且占用用户很少的带宽. MQTT是IBM推出的一种针对移动终端设备的基于TCP/IP ...

  3. Mina、Netty、Twisted一起学(一):实现简单的TCP服务器

    MINA.Netty.Twisted为什么放在一起学习?首先,不妨先分别看一下它们官方网站对其的介绍: MINA: Apache MINA is a network application frame ...

  4. JAVA编写WEB服务器

    一.超文本传输协议  1.1 HTTP请求  1.2 HTTP应答  二.Socket类  三.ServerSocket类  四.Web服务器实例  4.1 HttpServer类  4.2 Requ ...

  5. 响应式编程笔记三:一个简单的HTTP服务器

    # 响应式编程笔记三:一个简单的HTTP服务器 本文我们将继续前面的学习,但将更多的注意力放在用例和编写实际能用的代码上面,而非基本的APIs学习. 我们会看到Reactive是一个有用的抽象 - 对 ...

  6. 基于python2【重要】怎么自行搭建简单的web服务器

    基本流程:1.需要的支持     1)python本身有SimpleHTTPServer     2)ForkStaticServer.py支持,该文件放在python7目录下     3)将希望共享 ...

  7. 用 PHP 编写 http 服务器

    概述 众所周知,我们一般使用 PHP 开发Web程序时需要使用到比如Apache或Nginx等Web服务器来支持,那么有没有办法直接使用PHP开发HTTP服务器,答案当然是可以的,最近看了一遍Work ...

  8. 学习用node.js建立一个简单的web服务器

    一.建立简单的Web服务器涉及到Node.js的一些基本知识点: 1.请求模块 在Node.js中,系统提供了许多有用的模块(当然你也可以用JavaScript编写自己的模块,以后的章节我们将详细讲解 ...

  9. Golang 编写 Tcp 服务器

    Golang 作为广泛用于服务端和云计算领域的编程语言,tcp socket 是其中至关重要的功能.无论是 WEB 服务器还是各类中间件都离不开 tcp socket 的支持. Echo 服务器 拆包 ...

  10. 使用纯php构建一个简单的PHP服务器

    使用原生PHP构建一个简单的PHPWeb服务器 1.目录机构 webserver --src -- Response.php -- Server.php -- Request.php -- vendo ...

随机推荐

  1. js格式化数字

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. 浮动滚动条 slimScroll

    1.引入jquery 2.映入slimScrolljs :<script src="https://cdn.bootcss.com/jQuery-slimScroll/1.3.8/jq ...

  3. GitHub入门与实践 读书笔记二:Git的导入

    1.诞生背景 Linux的创始人Linus Torvalds 在2005年开发了Git的原型程序,后随着众多开发者的共同努力,现在他已经被大量的程序员采用. 2.什么是版本管理 版本管理:管理软件在开 ...

  4. Mysql5.7实现主从复制、基于GTID的主从复制、并行复制

    (一.主从复制) 一.mysql主从复制原理    mysql的默认复制方式是主从复制.Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制, ...

  5. Hadoop学习笔记01_Hadoop搭建

    想往大数据方向转, 难度肯定是有的. 基础知识肯定是要有的,如果是熟悉JAVA开发的人,转向应该优势大. 像我这样的,只有Linux基础以及简单的PHP基础的人,转向难度很大.但是事在人为,努力学习多 ...

  6. os、os.path模块(文件/目录方法)

    1.模块的概念:模块是一个包含所有定义的变量.函数的文件,模块可以被其余模块调用. 2.利用OS模块实现对系统文件的. os模块中常见的方法: gercwd()     返回当前工作目录 chdir( ...

  7. elasticsearch 使用快照进行备份

    Elasticsearch也提供了备份集群中索引数据的策略——snapshot API.它会备份整个集群的当前状态和数据,并保存到集群中各个节点共享的仓库中.这个备份的进程是增量备份的,在第一次备份的 ...

  8. JAVA8之函数式接口

    由于JDK8已经发布一段时间了,也开始逐渐稳定,未来使用JAVA语言开发的系统会逐渐升级到JDK8,因为为了以后工作需要,我们有必要了解JAVA8的一些新的特性.JAVA8相对JAVA7最重要的一个突 ...

  9. 1.python+appium环境配置

    环境部署 本博客以32位的Windows 7操作系统为例介绍Appium+Python的环境搭建步骤 1.安装Node.js 访问 https://nodejs.org/en/download/,下载 ...

  10. 03bootstrap_表格

    03bootstrap_表格 1.边框线表格:table,table-striped,table-bordered 2.紧缩表格:table table-hover table-condensed 文 ...