//一、设置一个8089端口的本地IP服务器
1 package myserver; import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; public class MyServer {
public MyServer() {
try {
ServerSocket socket = new ServerSocket(8089);
while (true) {
Socket s = socket.accept();
new SocketThread(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new MyServer();
}
}
 //二、多线程监听客户端连接
1 package myserver; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket; public class SocketThread implements Runnable{
private Socket socket; public SocketThread(Socket socket) {
this.socket = socket; Thread th = new Thread(this);
th.start();
} @Override
public void run() {
InputStream in = null;
OutputStream out = null;
try {
in = socket.getInputStream();//获取文件读取流
out = socket.getOutputStream();//获取文件写入流
Response response = new Response(out);//相应数据到浏览器
Request request = new Request(in);//从网页获取数据
System.out.println("********"+request);
String url = request.getUrl();//获取URL路径
//response.sendMessage("hello");
response.sendFile(url);
out.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
out.close();
in.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
 //三、请求相应处理
1 package myserver; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; public class Response {
private OutputStream out; public Response(OutputStream out) {
this.out = out;
} //发送消息到浏览器
public void sendMessage(String msg) {
try {
out.write(msg.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public void sendFile(String filePath) throws IOException {
File f = new File(filePath);
if (f.exists() == false) {//判断文件是否存在
return;
}
InputStream in = null;
try {
in = new FileInputStream(filePath);
byte[] by = new byte[1024];
int len = 0;
while ((len=in.read(by)) != -1) {
out.write(by, 0, len);//读取1024字节并写入到浏览器
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
in.close();
}
}
}
//接受客户端请求
1 package myserver; import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map; public class Request {
private String url;
//封装表单数据
private Map<String,String> paramMap = new HashMap<String,String>(); public Request(InputStream in) {
byte[] by = new byte[1024];
try {
in.read(by);
String str = new String(by).trim();//去掉两边空格
System.out.println(str); if (str.startsWith("GET")){//GET开头的流数据
this.getGet(str);
}else{//POST开头的流数据
this.getPOST(str);
}
} catch (IOException e) {
e.printStackTrace();
}
} private void getPOST(String str) {//获取POST的URL和表单数据
String[] s = str.split("\\s+");//按空格割分字符串为字符串数组
this.url = s[1].substring(1);//表单的POST提交
getMap(s[s.length-1]);//获取表单数据
} private void getGet(String str) {//获取GET的URL和表单数据
String[] s = str.split("\\s+");//按空格割分字符串为字符串数组
if (s[1].indexOf("?") == -1){
this.url = s[1].substring(1);//文本的GET提交
}else{
String s1 = s[1];
//表单的GET提交
this.url = s1.split("[?]")[0].substring(1);
this.getMap(s1.split("[?]")[1]);//获取表单数据
}
}
//GET /url POST|GET /url?userName=""&pwd=""&age=""&sex=""
private Map<String,String> getMap(String string) {//获取表单数据
String[] s = string.split("[&]");
for (String str : s) {
this.paramMap.put(str.split("[=]")[0], str.split("[=]")[1]);
}
return this.paramMap;
} public String getUrl() {
return this.url;
} @Override
public String toString() {
return "Request [url=" + url + ", paramMap=" + paramMap + "]";
}
}
 //模拟GET,POST请求表单提交的登录界面
1 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<img alt="" src="1.jpg" width="300" height="200"/><br/>
<img alt="" src="1.jpg" width="300" height="200"/><br/>
<p>智商不够,努力来凑</p> <form action="login" method="PUT">
<input type="text" name="userName"><br/>
<input type="password" name="pwd"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>

相应的数据流信息如下:

GET /login.html HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C)
UA-CPU: AMD64
Accept-Encoding: gzip, deflate
Host: localhost:8089
Connection: Keep-Alive
********Request [url=login.html, paramMap={}]

GET /1.jpg HTTP/1.1
Accept: */*
Referer: http://localhost:8089/login.html
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C)
UA-CPU: AMD64
Accept-Encoding: gzip, deflate
Host: localhost:8089
Connection: Keep-Alive
********Request [url=1.jpg, paramMap={}]

GET /login?userName=123&pwd=123 HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
Referer: http://localhost:8089/login.html
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C)
UA-CPU: AMD64
Accept-Encoding: gzip, deflate
Host: localhost:8089
Connection: Keep-Alive
********Request [url=login, paramMap={userName=123, pwd=123}]

GET /login?userName=123&pwd=123 HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C)
UA-CPU: AMD64
Accept-Encoding: gzip, deflate
Host: localhost:8089
Connection: Keep-Alive
********Request [url=login, paramMap={userName=123, pwd=123}]

GET /a.txt HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
Accept-Language: zh-CN
Cache-Control: no-cache
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C)
UA-CPU: AMD64
Accept-Encoding: gzip, deflate
Host: localhost:8089
Connection: Keep-Alive
********Request [url=a.txt, paramMap={}]

GET /1.jpg HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C)
UA-CPU: AMD64
Accept-Encoding: gzip, deflate
Host: localhost:8089
Connection: Keep-Alive
********Request [url=1.jpg, paramMap={}]

GET / HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
Accept-Language: zh-CN
Cache-Control: no-cache
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C)
UA-CPU: AMD64
Accept-Encoding: gzip, deflate
Host: localhost:8089
Connection: Keep-Alive
********Request [url=, paramMap={}]

总结:以上是用代码模拟实现的一个tomcat。

MyServer的更多相关文章

  1. 监控myserver计数器

  2. 开发者的利器:Docker 理解与使用

    困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...

  3. asp.net core 负载均衡集群搭建(centos7+nginx+supervisor+kestrel)

    概述 本文目的是搭建三台asp.net core 集群, 并配上 nginx做负载均衡   首先准备要运行的源码 http://pan.baidu.com/s/1c20x0bA 准备三台服务器(或则虚 ...

  4. Python(七)Socket编程、IO多路复用、SocketServer

    本章内容: Socket IO多路复用(select) SocketServer 模块(ThreadingTCPServer源码剖析) Socket socket通常也称作"套接字" ...

  5. Python09作业思路及源码:高级FTP服务器开发(仅供参考)

    高级FTP服务器开发 一,作业要求 高级FTP服务器开发 用户加密认证(完成) 多用户同时登陆(完成) 每个用户有不同家目录且只能访问自己的家目录(完成) 对用户进行磁盘配额,不同用户配额可不同(完成 ...

  6. [AlwaysOn Availability Groups]使用Powershell监控AlwayOn健康

    使用Powershell监控AlwayOn健康 1.基本命令概述 AlwayOn Dashboard是很有用的查看整体AG健康状况的工具.但是这个工具不是用于7*24监控的.如果应用程序夜间发送严重的 ...

  7. 介绍几种SSIS部署方式

    介绍 如果你已经开发完一个不错的SSIS包并且能够在你的本地完美的运行,每个任务都亮起绿色的通过标志.这时为了能够让这个包处理能够在指定时间运行,你需要将其发布到一个服务器上,并做好相关配置.作为开发 ...

  8. ASP.NET MVC Routing、Areas、URLs

    webForm页面运行起来url一般是这样的:localhost:****/index.aspx,这个过程就是当你运行页面的时候,vs开发工具自带的微型服务器会打开你存在硬盘上的这个文件然后显示在浏览 ...

  9. 基于corosync+pacemaker+drbd+LNMP做web服务器的高可用集群

    实验系统:CentOS 6.6_x86_64 实验前提: 1)提前准备好编译环境,防火墙和selinux都关闭: 2)本配置共有两个测试节点,分别coro1和coro2,对应的IP地址分别为192.1 ...

随机推荐

  1. 软件工程(GZSD2015)学生博客列表

    2015年贵州师范大学软件工程课程学生博客列表 陈小丽 郑倩 唐洁 周娟 李利思 肖俊 罗文豪 周静 徐明艳 毛涛 邓洪虹 岳庆 李盼 安坤 何亚 涂江凤 张义平 杨明颢 杨家堂 胡贵玲 寿克霞 吴明 ...

  2. 201521123084 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...

  3. 201521123019 《Java程序设计》第3周学习总结

    1. 本周学习总结 2. 书面作业 (1)代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...

  4. 201521123048 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  5. 201521123066 《Java程序设计》第十二周实验总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  6. JSP引入 - UEditor 富文本编辑器

    UEditor  JSP 因为是项目第一天就导入了,现在过去一个多星期了,可能会有问题 官网:http://ueditor.baidu.com/website/ 1. 解压对应的UEditor压缩包至 ...

  7. 数据库Mysql的安装及操作---数据引擎

    一.1.什么是数据           描述事物的符号记录称为数据.       2.什么是数据库         存放数据的仓库,只不过这个仓库在计算机上存储设备上. 二.Mysql的介绍     ...

  8. Windows的文件权限 研究笔记

    最近公司的一台设备中了病毒,杀了又出现,总是破坏机器上面运行的程序. 想着研究下文件权限,把文件设为只读,让病毒破坏不了即可. 于是开始了实验1: 首先建立一个txt文件,查看权限: 可以看到User ...

  9. JAVA数据流再传递

    有一个filter类,在请求进入的时候读取了URL信息,并且读取了requestBod中的参数信息,那么在请求到达实际的控制层时,入参信息是拿不到的,对这种情况就需要数据流做再传递处理. 处理原理:使 ...

  10. POJ3069(贪心+巧用优先队列)

    题目传送门:http://poj.org/problem?id=3069 题目大意:一个直线上有N个点.点i的距离是Xi.从这些点中选取若干个加上标记.要求:对于每个点,与其距离为R的范围内必有做标记 ...