import java.io.*;
import java.net.*;
/**
* <p>Title: 发现HTTP内容和文件内容</p>
* <p>Description: 获得用户请求后将用户需要的文件读出,添加上HTTP应答头。发送给客户端。</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Filename: Response.java</p>
* @version 1.0
*/
public class Response{
OutputStream out = null;
/**
*<br>方法说明:发送信息
*<br>输入参数:String ref 请求的文件名
*<br>返回类型:
*/
public void Send(String ref) throws IOException {
byte[] bytes = new byte[2048];
FileInputStream fis = null;
try {
//构造文件
File file = new File(WebServer.WEBROOT, ref);
if (file.exists()) {
//构造输入文件流
fis = new FileInputStream(file);
int ch = fis.read(bytes, 0, 2048);
//读取文件
String sBody = new String(bytes,0);
//构造输出信息
String sendMessage = "HTTP/1.1 200 OK\r\n" +
"Content-Type: text/html\r\n" +
"Content-Length: "+ch+"\r\n" +
"\r\n" +sBody;
//输出文件
out.write(sendMessage.getBytes());
}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" +
"<h1>File Not Found</h1>";
out.write(errorMessage.getBytes());
}
}
catch (Exception e) {
// 如不能实例化File对象,抛出异常。
System.out.println(e.toString() );
}
finally {
if (fis != null)
fis.close();
}
}
/**
*<br>方法说明:构造器,获取输出流
*<br>输入参数:
*<br>返回类型:
*/
public Response(OutputStream output) {
this.out = output;
}
}
import java.io.*;
import java.net.*;
/**
* <p>Title: 客户请求分析</p>
* <p>Description: 获取客户的HTTP请求,分析客户所需要的文件</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Filename: Request.java</p>
* @version 1.0
*/
public class Request{
InputStream in = null;
/**
*<br>方法说明:构造器,获得输入流。这时客户的请求数据。
*<br>输入参数:
*<br>返回类型:
*/
public Request(InputStream input){
this.in = input;
}
/**
*<br>方法说明:解析客户的请求
*<br>输入参数:
*<br>返回类型:String 请求文件字符
*/
public String parse() {
//从Socket读取一组数据
StringBuffer requestStr = new StringBuffer(2048);
int i;
byte[] buffer = new byte[2048];
try {
i = in.read(buffer);
}
catch (IOException e) {
e.printStackTrace();
i = -1;
}
for (int j=0; j<i; j++) {
requestStr.append((char) buffer[j]);
}
System.out.print(requestStr.toString());
return getUri(requestStr.toString());
}
/**
*<br>方法说明:获取URI字符
*<br>输入参数:String requestString 请求字符
*<br>返回类型:String URI信息字符
*/
private String getUri(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;
}
}
import java.io.*;
import java.net.*;
import java.util.*;
/**
* <p>Title: WEB服务器</p>
* <p>Description: 使用Socket创建一个WEB服务器,本程序是多线程系统以提高反应速度。</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Filename: WebServer.java</p>
* @version 1.0
*/
class WebServer
{
public static String WEBROOT = "";//默认目录
public static String defaultPage = "index.htm";//默认文件
public static void main (String [] args) throws IOException
{//使用输入的方式通知服务默认目录位置,可用./root表示。
if(args.length!=1){
System.out.println("USE: java WebServer ./rootdir");
return;
}else{
WEBROOT = args[0];
}
System.out.println ("Server starting...\n");
//使用8000端口提供服务
ServerSocket server = new ServerSocket (8000);
while (true)
{
//阻塞,直到有客户连接
Socket sk = server.accept ();
System.out.println ("Accepting Connection...\n");
//启动服务线程
new WebThread (sk).start ();
}
}
}
/**
* <p>Title: 服务子线程</p>
* <p>Description: 使用线程,为多个客户端服务</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Filename: </p>
* @author 杜江
* @version 1.0
*/
class WebThread extends Thread
{
private Socket sk;
WebThread (Socket sk)
{
this.sk = sk;
}
/**
*<br>方法说明:线程体
*<br>输入参数:
*<br>返回类型:
*/
public void run ()
{
InputStream in = null;
OutputStream out = null;
try{
in = sk.getInputStream();
out = sk.getOutputStream();
//接收来自客户端的请求。
Request rq = new Request(in);
//解析客户请求
String sURL = rq.parse();
System.out.println("sURL="+sURL);
if(sURL.equals("/")) sURL = WebServer.defaultPage;
Response rp = new Response(out);
rp.Send(sURL);
}catch (IOException e)
{
System.out.println (e.toString ());
}
finally
{
System.out.println ("Closing Connection...\n");
//最后释放资源
try{
if (in != null)
in.close ();
if (out != null)
out.close ();
if (sk != null)
sk.close ();
}
catch (IOException e)
{
}
}
}
}
[JAVA100例]050、一个简单的Web服务器
时间: 2024-09-07 10:43:14
[JAVA100例]050、一个简单的Web服务器的相关文章
一个简单的web服务器
写在前面 新的一年了,新的开始,打算重新看一遍asp.net本质论这本书,再重新认识一下,查漏补缺,认认真真的过一遍. 一个简单的web服务器 首先需要引入命名空间: System.Net,关于网络编程的大部分类型及操作都可以在这个命名空间下找到. IPAddress:类用来表示一个ip地址. IPEndPoint:用来表示一个IP地址和一个端口号的组合,称为网络的端点. System.Net.Sockets:命名空间中提供了基于Socket编程的数据类型. Socket类封装了Socket的操
《深入剖析Tomcat》一第 1 章 一个简单的Web服务器
第 1 章 一个简单的Web服务器 本章介绍Java Web服务器是如何运行的.Web服务器也称为超文本传输协议(HyperText Transfer Protocol,HTTP)服务器,因为它使用HTTP与其客户端(通常是Web浏览器)进行通信.基于Java的Web服务器会使用两个重要的类:java.net.Socket类和java.net.ServerSocket类,并通过发送HTTP消息进行通信.本章先介绍HTTP协议和这两个类,然后介绍一个简单的Web服务器.
如何用node.js实现一个简单的web服务器
node.js实现web服务器还是比较简单的,我了解node.js是从<node入门>开始的,如果你不了解node.js也可以看看! 我根据那书一步一步的练习完了,也的确大概了解了node.js,不过里面写的路由的地方总感觉不方便,十一放假最后一天,试着写了个简单的web服务器,现在分享记录于此! http模块已提供了基本功能,所以我主要解决两个问题,1是静态资源的处理,2是动态资源的路由. 静态资源在node.js里的意思是不变的,如图片.前端js.css.html页面等. 动态资源我们一般
创建一个简单的web服务器
Web服务器也称为超文本传输协议(HTTP)服务器,因为它使用HTTP来跟客户端进行通信的.既然说到通信那就离不了Java里的两个重要的类java.net.Socket和java.net.ServerSocket.这里浏览器一方可以认为是一个客户端,接收HTTP请求的一方可以认为是服务端.在这之前我们先说一下HTTP协议. HTTP协议允许web服务器和浏览器通过网络来进行发送和接收数据.它是一种请求和响应协议.客户端发送一个请求,服务端响应这个请求.HTTP请求由三部分组成,分别是:请求行.消
go 语言实现一个简单的 web 服务器
学习Go语言的一些感受,不一定准确. 假如发生战争,JAVA一般都是充当航母战斗群的角色.一旦出动,就是护卫舰.巡洋舰.航母舰载机.预警机.电子战飞机.潜艇等等浩浩荡荡,杀将过去.(JVM,数十个JAR包,Tomcat中间件,SSH框架,各种配置文件...天生就是重量级的,专为大规模作战) 而GO语言更像F35战斗轰炸机单枪匹马,悄无声息,投下炸弹然后走人.专属轰炸机,空战也会一点点.实在搞不定,就叫它大哥F22.(GO是编译型语言,不需要依赖,不需要虚拟机,可以调用C代码并且它足够简单,却非常
创建一个简单的web服务器(二):使用自定义的类加载器来替换URLClassLoader
在上一章中我们加载Servlet用的是URLClassLoader,在这一章中我们使用自定义的类加载器来替换URLClassLoader.关于类加载器的文章请参考这里:深入探讨 Java 类加载器.这篇文章写得很棒. 具体的代码如下: package com.zkn.imitate.tomcat.secondchapter.first; import com.zkn.imitate.tomcat.secondchapter.Request; import com.zkn.imitate.tomc
Java Socket编程(五) 简单的WEB服务器_Java编程
文章来源:aspcn 作者:孙雯 简单的WEB服务器 一个简单的WEB服务器将由列表9.2这样构建.当然,还必须要对方法和回应事件进行改进.简单的服务器不会分析和存储请求头.新的WEB服务器将分析和存储请求,为以后的处理作准备.为了达到这个目的,你必须有一个包含HTTP请求的类. HTTPrequest类 列表9.5列出了一个完整的HTTPrequest类.这个类必须包括一个请求头所需的所有信息. 列表9.5.HTTPrequest类. import java.io.*; import java
深入剖析tomcat之一个简单的web服务器
这个简单的web服务器包含三个类 HttpServer Request Response 在应用程序的入口点,也就是静态main函数中,创建一个HttpServer实例,然后调用其await()方法.顾名思义,await方法会在制定的端口上等待http请求,并对其进行处理,然后发送相应的消息回客户端.在接收到命令之前,它会一直保持等待的状态. HttpServer类 package simpleHttpServer; import java.io.File; import java.io.IOE
使用 CodeIgniter 创建一个简单的 Web 站点
原文:使用 CodeIgniter 创建一个简单的 Web 站点 参考源自: http://www.ibm.com/developerworks/cn/web/wa-codeigniter/index.html 我的第一个 CodeIgniter 项目(除HelloWorld外),现整理记录下来. 相关环境: 系统:ubuntu-10.04.3 Apache:httpd-2.4.7 PHP:php-5.4.22 MySQL:mysql-5.6.16 CI:CodeIgniter-2.2.