- 浏览: 603130 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
ls1259775:
写的太好了,通俗易懂。
Spring之aop入门实例 -
王庆波-行:
逻辑好清晰,学习了,感谢分享!
关于web.xml中的<welcome-file-list>中的默认首页文件 -
netwelfare:
文章写的不错,不过还有一些东西没有讲解到。可以看这篇文章:Ht ...
HttpClient使用Post和Get提交参数 -
zglxx2004:
感谢!
Eclipse里maven的project报Unbound classpath variable: 'M2_REPO/**/***/***.jar -
没有这个名字:
博主,可以注释一下吗?
HttpClient模仿浏览器cookie请求需要登陆验证的页面
之前有javaeyer推荐了一本书《how tomcat works》,今天晚上看了看,确实不错,第一眼就着迷了。 于是乎就学着书上的例子敲了敲,学会了一个简单web服务器的大概实现,当然,这个简直就无法称之为web服务器,但是也算是走进web服务器的第一步吧。 这篇文章仅限于学习记录,文笔凌乱之处,还望各位见谅。 OK,下面进入正题; 开始之前,首先我们要清楚以下几个内容。 首先,一个最简单服务器包括三个部分: 这个服务器如何使用: OK, 放上代码, 代码只有3个类,都挺简单的, 这个应用只是一个最最简单的雏形: 主类: HttpServer 接下来是请求类: Request 有了请求了,服务器就得响应啊,试想,我发个请求没反应,你的第一反应是不是想砸电脑呢? OK,Response类来了。 OK,现在这个应用可以运行了,但是你运行起来,没办法用,为什么, 因为还需要有用户请求的静态资源。 在HttpServer类中,我们hard code了一个webroot目录,约定把所有的静态资源都放到这个目录下面的。 下面我们就把这个目录建好,并放一点资源进去 ,我是这样放的, 如图: index.html 中 就只有一行代码: OK, 下面我们运行一下 HttpServer ,得到页面 如下图: 在控制台,你将会看到程序打印出: 接着,我们尝试请求一个不存在的资源: 我们会的到一个404的错误页面. OK, 一个简单的web服务器就完成了, 虽然简单,但是我们可以通过这个了解一个大概的流程。 以及复习一下java net包与HTTP/1.1协议的一些知识。 也希望这个篇文章对都有需要的人有帮助。 PS: 最近有很多朋友都问这本书哪里有买,我本人并非看的纸质的,而是电子版的, 需要下载的可以去新浪共享频道找找, 我的是从哪里下来的, 中文书名就叫 <tomcat工作原理>
web服务器----HttpServer
请求---Request
响应---Response
1. 请求静态资源 通过 http://localhost:8090/index.html
成功 则返回页面, 否则会返回 File Not Found 的错误信息.
PS:比如上面的index.html 必须放在一个webroot目录下.
2. 服务器的关闭通过uri来处理
通过http://lcoalhost:8090/SHUTDOWN 这个Uri来停止服务器.
需要注意的其他几个知识点:
1. HTTP/1.1 协议的知识。 比如 请求,响应的结构。 发送与接收形式等.
2. Java中网络的相关只是 ServerSocket 与 Socket 的使用.package chapter1.simplewebserver;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
*
* 下午11:59:29
* @author gogole_09
* 简单web服务器
*/
public class HttpServer {
//定位到webroot目录
public static final String WEB_ROOT=System.getProperty("user.dir")+File.separator+"webroot";
//停止命令
private static final String SHUTDOWN_COMMAND="/SHUTDOWN";
//是否接收到了关闭命令
private boolean shutdown=false;
/**
* 等待命令
*/
public void await(){
ServerSocket serverSocket=null;
int port=8090;
try {
serverSocket=new ServerSocket(port,1,InetAddress.getByName("127.0.0.1"));
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
//监听端口,等待请求。
while(!shutdown){
Socket socket=null;
InputStream input=null;
OutputStream output=null;
try {
socket=serverSocket.accept();
//输入流 有过jsp编程的哥们都知道这是干嘛的
input=socket.getInputStream();
//输出流
output=socket.getOutputStream();
//构建请求
Request request=new Request(input);
//解析请求信息
request.parse();
//响应类
Response response=new Response(output);
response.setRequest(request);
response.sendStaticResource();
//处理完毕,关闭
socket.close();
//检查提供的URI是否为shutdown命令
shutdown=request.getUri().equals(SHUTDOWN_COMMAND);
} catch (Exception e) {
e.printStackTrace();
continue;
}
}
}
public static void main(String[] args) {
HttpServer server=new HttpServer();
server.await();
}
}
package chapter1.simplewebserver;
import java.io.IOException;
import java.io.InputStream;
/**
*
* 上午12:09:36
* @author gogole_09
* 简单服务器的请求类
*/
public class Request {
private InputStream input;
private String uri;
public Request(InputStream in) {
this.input=in;
}
/**
* 解析Uri操作
*/
public void parse() {
StringBuffer buf=new StringBuffer();
int i;
byte[] buffer=new byte[2048];
try {
i=input.read(buffer);
} catch (IOException e) {
e.printStackTrace();
i=-1;
}
for(int j=0;j<i;j++){
buf.append((char)buffer[j]);
}
System.out.println(buf.toString());
uri=parseUri(buf.toString());
}
/**
* 解析Uri
* 为什么要以' '为做标识 , 这里需要了解HTTP协议的相关结构;
* 一个请求行 以 请求方法开头 + 请求URI+ 请求协议版本 + CRLF字符结束
* 比如,你请求index.html 用GET方式 ,那么Uri形式为:
*
* GET /index.html HTTP/1.1
*
*
* @param requestString
* @return
*/
private String parseUri(String requestString){
int index1,index2;
index1=requestString.indexOf(' ');
if(index1!=-1){
index2=requestString.indexOf(' ',index1+1);
if(index2>index1){
return requestString.substring(index1+1,index2);
}
}
return null;
}
public String getUri() {
return uri;
}
}
package chapter1.simplewebserver;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
*
* 上午12:10:58
*
* @author gogole_09 简易服务器的响应类
*/
public class Response {
/**
* HTTP响应格式:= Status-Line
* *((general-header|response-header|entity-header)CRLF) CRLF [message-body]
* Status-Line=HTTP-Version SP(空格) Status-Code SP Reason-Phrase CRLF
*
*/
private static final int BUFFER_SIZE = 1024;
Request request;
private OutputStream output;
public Response(OutputStream output) {
this.output = output;
}
public void setRequest(Request request) {
this.request = request;
}
/**
* 服务器解析并发送静态资源
* @throws IOException
*/
public void sendStaticResource() throws IOException {
byte[] bytes = new byte[BUFFER_SIZE];
FileInputStream fis = null;
try {
File file = new File(HttpServer.WEB_ROOT, request.getUri());
if (file.exists()) {
fis = new FileInputStream(file);
int ch = fis.read(bytes, 0, BUFFER_SIZE);
while (ch != -1) {
output.write(bytes, 0, ch);
ch = fis.read(bytes, 0, BUFFER_SIZE);
}
} else {
//文件没找到
String errorMessage = "HTTP/1.1 404 File Not Found\r\n"
+ "Content-Type:text/html\r\n"
+ "Content-Length:23\r\n"+"\r\n<ht>File Not Found</h1>";
output.write(errorMessage.getBytes());
}
} catch (Exception e) {
System.out.println(e.toString());
}finally{
if(fis!=null)
fis.close();
}
}
}
发表评论
-
【转帖】解码OutOfMemoryError:PermGen Space
2013-12-30 11:22 1101本文由 ImportNew - Peter Pan ... -
JBoss下面部署应用的Log4j日志不能显示问题
2012-08-31 13:36 5536在应用的WEB-INF目录下面增加该文件:jboss-depl ... -
WEB容器启动的时候,加载常用数据到内存
2010-08-07 10:41 5715项目中,有很多数据是基本上不变的,同时用到的频率还比较高,如果 ... -
java.lang.OutOfMemoryError: PermGen space的解决办法
2010-05-31 15:38 1734修改tomcat 的catalina.bat文件,加入: se ... -
使用UrlRewriteFilter动态URL静态化
2010-04-20 15:42 1625先看两种URL的写法: 引用http://www.xxx.co ... -
Eclipse里maven的project报Unbound classpath variable: 'M2_REPO/**/***/***.jar
2010-04-19 16:49 11106Eclipse里maven的project报Unbound c ... -
java序列化(Serializable)的作用和反序列化
2010-03-24 11:03 5427这里转载一篇讲解java序 ... -
java.util.Collections.sort对List进行排序
2010-03-23 16:41 2038List<userDO> list = new A ... -
iText生成PDF文件,每页显示页码以及总页数的实现
2009-11-10 16:35 18305如果想在页眉或者页脚加上第x页这样的信息,用普通的Header ... -
iText导出PDF使用小结
2009-11-10 15:42 4236新建一PDF页面,设置输出流: Document docume ... -
jar包里面的代码如何读取jar包中的配置文件?
2009-10-09 16:28 4680先看代码目录结构: src/weather/ Quer ... -
JAVA登陆MSN并且获取联系人列表
2009-09-22 14:15 2850package msn; import net.sf. ... -
实战篇:设计自己的Annotation
2009-08-26 16:33 1337【转载】From:http://lighter.iteye.c ... -
支付宝外部商家接口中的return_url和notify_url
2009-08-25 15:34 5250return_url: 1、同步返回接口,作为参数传递给支付宝 ... -
多JBOSS公存时需要修改的端口号
2009-07-13 13:56 19411.修改server/default/conf/jboss_s ... -
struts.properties配置
2009-07-07 11:04 1270struts.properties文件在WEB-INF/cla ... -
request.getHeader("REFERER")获取来访页面地址
2009-07-01 10:46 4610request.getHeader("REFERER ... -
split分隔特殊字符"| ^ . *"等特殊字符
2009-06-18 16:16 4170String a = "china|hangzhou ... -
如何让tomcat支持软链接
2009-06-15 20:56 3542最近在做个图片上传的页面,需要把上传的图片放到tomcat部署 ... -
Accept-Encoding: gzip,deflate
2009-06-11 16:58 31560前面一片Blog内容是说用程序模仿浏览器来请求页面。 之前在 ...
相关推荐
部署Web服务通常有两种方式:通过Web容器(如Tomcat)或直接使用Axis的内置服务器。在Web应用的WEB-INF目录下创建services子目录,将生成的服务部署文件(.aar文件)放入其中,然后通过Web容器启动服务。 **五、...
ReYoPrint (锐洋WEB打印控件)是一款实现网页套打的专用工具。作为web应用开发者,我们经常会遇到在浏览器中打印报表、票据的需求,这些需求浏览器本身的打印功能一般不能满足, 如精确打印,分页,套打等。这就...
随心所欲的Web页面打印技术是针对基于B/S架构的应用程序中客户端页面打印问题的一种解决方案。传统的Web页面打印方式,如使用IE的内置打印功能或水晶报表,往往无法满足特定的排版和定位需求。因此,本文探讨了一种...
这个压缩包文件"案例解析SAP_第二章"似乎包含了一个关于SAP系统使用的教学或演示材料,特别关注第二章的内容。由于文件名仅有一个".swf"文件,我们可以推测这是一个Flash动画或互动教程,通常用于视觉展示和交互式...
动网转贴可能需要解析这些数据来获取帖子的信息,如标题、内容、作者等,并将它们封装到转发请求中。 3. **用户身份验证**:为了确保用户权限和安全性,动网转贴功能可能涉及到用户登录状态的检查和验证,这可能...
总的来说,"易语言动网转贴"可能是一个结合了网络爬虫、数据解析、数据库操作等多个技术领域的项目。对于初学者,可以通过学习这个项目了解易语言的编程实践;对于有经验的开发者,它可以作为一个研究网络数据迁移和...
《动易系统的论坛转贴工具详解与应用》 在互联网信息交流日益频繁的今天,论坛作为用户互动的重要平台,其内容分享与传播的作用不容忽视。动易系统的论坛转贴工具,便是为了解决用户在论坛间便捷分享内容而设计的一...
从标签“ASP”我们可以推断,这个工具的实现依赖于ASP技术,包括使用VBScript或JScript等脚本语言编写,以及可能利用了IIS(Internet Information Services)作为Web服务器运行。开发者或者有兴趣学习ASP的人可以...
动网是中国早期知名的网络论坛软件之一,提供了丰富的社区功能,允许用户发帖、回帖、互动等。这个压缩包可能是从动网论坛导出的数据,用于数据迁移、备份或者分析。 【描述】由于提供的描述仅为"动网转贴.e.rar",...
综上所述,"导电泡棉转贴装置"在电子政务中的应用涉及到硬件设计、设备维护、电磁兼容性和法规遵从等多个方面,是保障电子政务系统稳定运行的关键技术之一。通过阅读"行业分类-电子政务-导电泡棉转贴装置.pdf"这份...
- 同Web服务器配置一样,确保FTP站点的日志记录功能已经启用。 - **解释**: - 日志记录对于监控FTP服务器的活动至关重要,可以帮助管理员追踪用户行为、检测异常情况等。 ##### 3. 设置主目录和访问权限 - **...
以下为转贴。 $GPGGA,,,,,,,,,,M,,M,,*hh<CR><LF> 传送的信息说明如下: $GPGGA: 起始引导符及语句格式说明(本句为GPS定位数据) <1> UTC时间,时时分分秒秒格式 <2> 纬度,度度分分.分分分分格式(第一位是零也将...
【凹丫丫ASP.NET新闻系统学习(转贴)】是一个基于Visual Studio 2005(VS2005)和SQL Server 2005的教程资源,旨在帮助开发者学习如何构建一个基本的新闻信息发布系统。这个系统可能涵盖了新闻的添加、编辑、删除...
在“动网转贴”项目中,用户可能可以通过界面浏览帖子,搜索特定内容,甚至进行简单的互动操作。 作为学习和参考的实例,这个项目能帮助你掌握易语言的基本语法和编程技巧,了解网络编程的基本流程,以及如何设计和...
由于现在流行的转贴工具都是基于浏览器的,转换速度比较慢,还得打开浏览器才能使用(同时受到浏览器版本限制)。 <br> 而这个小程序则完全不依赖于浏览器,以BFC采集器的UBB转换模块为基础,转换速度超快,...
去除Html中的干扰码等(样例中以轻之国度的干扰码为例) 配置文件语法: 方法类型(整数) 最大匹配长度(整数) 字符串1(删除开头) 字符串2(删除结尾) 方法类型: 1:删除单行 2:删除行与行之间的
2. **JSON格式**:在客户端和服务器之间交换数据时,JSON(JavaScript Object Notation)是一种常用格式,因为它是轻量级的且易于解析。 3. **Eclipse插件或工具**:可能使用了特定的Eclipse插件来帮助开发者调试或...