`
sherrysky
  • 浏览: 88685 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

用Java实现Web服务器

阅读更多
HTTP协议
超文本传输协议(HTTP)是位于TCP/IP 协议的应用层,是最广为人知的协议,也是互连网中最核心的协议之一,同样,HTTP 也是基于 C/S 或 B/S 模型实现的。事实上,我们使用的浏览器如Netscape 或IE 是实现HTTP 协议中的客户端,而一些常用的Web 服务器软件如Apache、IIS 和iPlanet Web Server 等是实现HTTP 协议中的服务器端。Web 页由服务端资源定位,传输到浏览器,经过浏览器的解释后,被客户所看到。

Web 的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信。HTTP协议是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。

一个完整的HTTP协议会话过程包括四个步骤:

◆ 连接,Web浏览器与Web服务器建立连接,打开一个称为Socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功;

◆ 请求,Web浏览器通过Socket向Web服务器提交请求。HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递);

◆ 应答,Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面;

◆ 关闭连接,应答结束后Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接。

Java实现Web服务器功能的程序设计

编程思路
根据上述HTTP协议的会话过程,本实例中实现了GET请求的Web服务器程序的方法,方法如下:

通过创建ServerSocket 类对象,侦听用户指定的端口(为8080),等待并接受客户机请求到端口。创建与Socket相关联的输入流和输出流,然后读取客户机的请求信息。若请求类型是GET,则从请求信息中获取所访问的HTML 文件名;如果HTML 文件存在,则打开HTML 文件,把HTTP 头信息和HTML 文件内容通过Socket 传回给Web浏览器,然后关闭文件,否则发送错误信息给Web 浏览器。最后关闭与相应Web 浏览器连接的Socket。
编程技巧说明
◆ 主线程设计
主线程的设计就是在主线程httpServer 类中实现了服务器端口的侦听,服务器接受一个客户端请求之后创建一个线程实例处理请求.
◆ 连接处理分线程设计
在分线程httpRequestHandler 类中实现了HTTP 协议的处理,这个类实现了Runnable 接口.
◆ 构建processRequest()方法来处理信息的接收和发送
作为实现Runnable 接口的主要内容,在run()方法中调用processRequest()方法来处理客户请求内容的接收和服务器返回信息的发送.
源代码如下
用Java编写Web服务器httpServer.java文件:
import java.net.*;
import java.io.*;
import java.util.*;
import java.lang.*;
public class httpServer{
    public static void main(String args[]) {
	int port;
	ServerSocket server_socket;
        //读取服务器端口号
	try {
            port = Integer.parseInt(args[0]);
	}
	catch (Exception e) {
	    port = 8080;
	}
	try {
            //监听服务器端口,等待连接请求
	    server_socket = new ServerSocket(port);
	    System.out.println("httpServer running on port " +
		       server_socket.getLocalPort());
	    //显示启动信息
	    while(true) {
		Socket socket = server_socket.accept();
		System.out.println("New connection accepted " +
				   socket.getInetAddress() +
				   ":" + socket.getPort());
		//创建分线程
		try {
		    httpRequestHandler request =
			new httpRequestHandler(socket);
		       Thread thread = new Thread(request);
		    //启动线程
		    thread.start();
		}
		catch(Exception e) {
		    System.out.println(e);
		}
	    }
	}
	catch (IOException e) {
	    System.out.println(e);
	}
    }
}

用Java编写httpRequestHandler.java文件的源代码如下:
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.StringTokenizer;

class httpRequestHandler implements Runnable
{
    final static String CRLF = "\r\n";
    Socket socket;
    InputStream input;
    OutputStream output;
    BufferedReader br;
    // 构造方法
    public httpRequestHandler(Socket socket) throws Exception
    {
	this.socket = socket;
	this.input = socket.getInputStream();
	this.output = socket.getOutputStream();
	this.br =
	    new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }
    // 实现Runnable 接口的run()方法
    public void run()
    {
	try {
	    processRequest();
	}
	catch(Exception e) {
	    System.out.println(e);
	}
    }
    private void processRequest() throws Exception
    {
	while(true) {
            //读取并显示Web 浏览器提交的请求信息
	    String headerLine = br.readLine();
	    System.out.println("The client request is "+headerLine);
	    if(headerLine.equals(CRLF) || headerLine.equals("")) break;
	    StringTokenizer s = new StringTokenizer(headerLine);
	    String temp = s.nextToken();
	    if(temp.equals("GET")) {
		String fileName = s.nextToken();
		fileName = "." + fileName ;
		// 打开所请求的文件
		FileInputStream fis = null ;
		boolean fileExists = true ;
		try
		    {
			fis = new FileInputStream( fileName ) ;
		    }
		catch ( FileNotFoundException e )
		    {
			fileExists = false ;
		    }
		// 完成回应消息
		String serverLine = "Server: a simple java httpServer";
		String statusLine = null;
		String contentTypeLine = null;
		String entityBody = null;
		String contentLengthLine = "error";
		if ( fileExists )
		    {
			statusLine = "HTTP/1.0 200 OK" + CRLF ;
			contentTypeLine = "Content-type: " +
			    contentType( fileName ) + CRLF ;
			contentLengthLine = "Content-Length: "
			    + (new Integer(fis.available())).toString()
			    + CRLF;
		    }
		else
		    {
			statusLine = "HTTP/1.0 404 Not Found" + CRLF ;
			contentTypeLine = "text/html" ;
			entityBody = "<HTML>" +
			    "<HEAD><TITLE>404 Not Found</TITLE></HEAD>" +
			    "<BODY>404 Not Found"
			    +"<br>usage:http://yourHostName:port/"
			    +"fileName.html</BODY></HTML>" ;
		    }
		// 发送到服务器信息
		output.write(statusLine.getBytes());
		output.write(serverLine.getBytes());
		output.write(contentTypeLine.getBytes());
		output.write(contentLengthLine.getBytes());
              	output.write(CRLF.getBytes());
		// 发送信息内容
		if (fileExists)
		    {
			sendBytes(fis, output) ;
			fis.close();
		    }
		else
		    {
			output.write(entityBody.getBytes());
		    }
	    }
	}
        //关闭套接字和流
	try {
	    output.close();
	    br.close();
	    socket.close();
	}
	catch(Exception e) {}
    }
    private static void sendBytes(FileInputStream fis, OutputStream os)
	throws Exception
    {
	// 创建一个 1K buffer
	byte[] buffer = new byte[1024] ;
	int bytes = 0 ;
	// 将文件输出到套接字输出流中
	while ((bytes = fis.read(buffer)) != -1 )
	    {
		os.write(buffer, 0, bytes);
	    }
    }
    private static String contentType(String fileName)
    {
	if (fileName.endsWith(".htm") || fileName.endsWith(".html"))
	    {
		return "text/html";
	    }

	return "fileName";
    }
}

显示Web页面的index.html 文件代码如下:
<html>
<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Java Web 服务器</title>
</head>
<body>
<p>********* <font color="#FF0000">欢迎你的到来!</font>*********</p>
<p>这是一个用 Java 语言实现的 Web 服务器</p>
<hr>
</body>
</html>

运行实例
为了测试上述程序的正确性,将编译后的httpServer.class、httpRequestHandler.class和上面的index.html文件置于网络的某台主机的同一目录中。
首先运行服务器程序 java httpServer 8080,服务器程序运行后显示端口信息“httpServer runing on port 8080”, 然后在浏览器的地址栏中输入http://localhost:8080/index.html,就可以正确显示网页,同时在显示“httpServer runing on port 8080 ”窗口中服务器会出现一些信息。
分享到:
评论

相关推荐

    计算机网络实验一 Windows环境下用java实现web服务器

    在本实验中,我们将探索如何在Windows环境下使用Java语言实现一个基本的Web服务器。这个实践项目旨在深化学生对HTTP协议的理解,以及Web服务器的工作机制。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络...

    用java实现Web服务器

    ### 使用Java实现Web服务器的关键知识点 #### 一、HTTP协议的作用原理 HTTP协议(HyperText Transfer Protocol)是一种应用层协议,用于从Web服务器传输超文本到本地浏览器的传输协议。它使得分布式、协作式和超...

    JAVA服务器]用Java实现Web

    要理解如何用Java实现Web服务器,首先要了解Web服务器的工作原理和HTTP协议的基础知识。 **Web服务器的工作原理** Web服务器的核心职责是处理来自Web浏览器的HTTP请求,并返回相应的HTTP响应。这个过程基于客户机/...

    WINDOW环境下用JAVA实现WEB服务器_MultiWebServer.java

    WINDOW环境下用JAVA实现WEB服务器_MultiWebServer.java (1)处理一个http请求 (2)接收并解析http请求 (3)从服务器文件系统中获得被请求的文件 (4)创建一个包括被请求的文件的http响应信息 直接发送该信息到...

    用JAVA实现WEB服务器知识.pdf

    在本文档“用JAVA实现WEB服务器知识.pdf”中,主要讨论了如何使用Java语言来实现一个简单的Web服务器。Web服务器的核心功能是处理HTTP(超文本传输协议)请求并返回响应。以下是基于文档内容的关键知识点的详细说明...

    使用java 实现web服务器,源代码,实现能访问html,css,jpg,jpeg

    标题指出我们要用Java实现一个Web服务器,这意味着我们需要了解Java编程语言以及网络编程的基本概念。Web服务器的主要任务是接收HTTP请求并返回HTTP响应,所以我们要掌握HTTP协议的基础知识。 描述中提到,这个Web...

    java实现web server功能

    本资源以"java实现web server功能"为主题,旨在教你如何使用Java编写一个简单的Web服务器,让我们一起深入探讨这个主题。 首先,理解Web服务器的基本工作原理至关重要。Web服务器接收客户端(通常是Web浏览器)发送...

    java实现web服务器httpServer

    一个用java实现的web服务器 httpserver

    java实现web服务器的方法

    java实现web服务器的方法

    简单JAVA WEB服务器

    【Java Web服务器基础】 在IT领域,Java Web服务器是一种用于处理HTTP请求并返回Web内容的软件。本项目“简单JAVA WEB服务器”旨在提供一个基础的平台,帮助学习者理解Java Web服务器的工作原理,特别是静态网页...

    WINDOWS 环境下用JAVA 实现WEB 服务器

    (1)处理一个 http 请求 (2) 接收并解析 http 请求 (3) 从服务器文件系统中获得被请求的文件 (4) 创建一个包括被请求的文件的 http 响应信息 (5) 直接发送该信息到客户端

    关于Java的Web服务器的搭建

    在IT行业中,Java Web服务器的搭建是开发人员和运维工程师必备的技能之一。本文将详细介绍两种常见的搭建方法:方案一采用JDK1.5搭配Resin3.0手动搭建,方案二则是通过集成开发环境Eclipse或MyEclipse配置Resin...

    java web 服务器 源码

    8. **src 目录**: 存放原始的Java源代码,开发者可以在这里查看Web服务器的实现细节。 9. **webapps 目录**: 标准的Tomcat或者任何Java Web服务器的结构中,webapps目录是用来存放Web应用程序的。每个子目录代表一...

    java实现web服务器.pdf

    在Java中实现Web服务器,主要利用java.net.Socket和java.net.ServerSocket类。ServerSocket监听特定端口等待客户端连接,当连接建立后,创建Socket对象用于与客户端进行双向通信。HTTP消息可以通过Socket的输入和...

    java 实现简单web服务器

    用java语言实现了最简单的web服务器,供大家参考!

    Java Web 服务器原理

    Java Web服务器原理主要涉及到Web应用的部署、运行和管理,其中Tomcat是一个广泛使用的开源Java Servlet容器,它是Java EE(现在称为Jakarta EE)的一部分。本文将深入探讨Java Web服务器的工作原理,特别是Tomcat的...

Global site tag (gtag.js) - Google Analytics