基于JAVA的WEB服务器工作机制(2)

原创 2004年01月20日 21:12:00

ServerSocket

Socket 类表示的是客户端的socket。无论什么时候,只要你想连接到一个远程服务器的应用,你都要构建一个socket。如果你想执行一个服务器应用程序,比如HTTP服务或者FTP服务的程序,那么你需要使用不同的途径。因为你的服务器必须一直是开机闲置,所以它不知道什么时候客户机试图来连接它。

这个时候,需要使用java.net.ServerSocket 类。它会实现一个服务器socket。一个服务器socket会等待来自客户端的连接。一旦它接收到一个连接请求,它就会创建一个  Socket 实例来处理和客户端通讯的问题。

要创建一个服务器socket,可以使用四种ServerSocket类构造方法中的一种来实现。你需要制定服务器socket监听的IP地址和端口。 典型的,IP地址如果是127.0.0.1,意味着服务器socket将监听本地机器。这个被监听的IP地址被认为是一种绑定地址。server socket的另一个重要属性是它的 backlog属性,它是在server socket拒绝连接请求前,能够接受的连接请求的最大队列长度。

ServerSocket类的构造函数之一如下:

对于这个构造函数而言,绑定地址必须是java.net.InetAddress 的一个实例。一个简单的办法是通过调用它的静态方法getByName来构造一个InetAddres对象。该方法来一个包含主机名的字符串参数:

下面一行代码构造一个ServerSocket ,它监听本地机器的8080端口,backlog设置为1。

一旦有了一个 ServerSocket 实例,可以通过调用accept方法来告诉它等待进来的连接请求。这个方法只有在有一个连接请求时才返回。它返回的是Socket类的实例。这个Socket对象能够发送和接受来自客户端应用的字节流,就是第一节所讲到的socket类。实际上,accept 是本文提及的唯一一个在应用中使用的方法。

Application应用

我们的web服务器应用是ex01.pyrmont包的一部分,包含三个类:

  • HttpServer
  • Request
  • Response

这个应用的入口(静态main方法)是HttpServer类。它创建了一个HttpServer 实例来调用它的await方法。 就象这个方法名所暗示的,await 方法在一个指定的端口等待一个HTTP请求,并处理它们,然后发送回应给客户端。它保持等待状态,直到收到一个shutdown命令。 (命令名await来代替wait的原因是wait是System.Object类中的一个用于线程方面的重要方法)

应用仅仅只发送静态资源,比如来自特定目录的HTML和图片文件。不支持动态包头 (比如日期或者cookie) 。

在下面的段落中,让我们来看看这三个类吧。

HttpServer

HttpServer类表示一个web服务器,且在公共静态目录WEB_ROOT及它的子目录中能为找到的那些静态资源而服务。WEB_ROOT用以下方式初始化:

这段代码指明了一个包含静态资源的webroot目录,这些资源可用来测试该应用。在该目录中也能找到servlet容器。

要请求一个静态资源,在浏览器中输入如下地址或URL:

machineName 是运行这个应用的计算机名或者IP地址。如果你的浏览器是在同一台机器上,可以使用localhost作为机器名。端口是8080。staticResource是请求的文件夹名,它必须位于WEB-ROOT目录中。

必然,如果你使用同一个计算机来测试应用,你想向HttpServer请求发送一个index.html 文件,那么使用如下URL:

想要停止服务器,可以通过发送一个shutdown命令。该命令是被HttpServer 类中的静态SHUTDOWN_COMMAND变量所定义:

因此,要停止服务,你可以使用命令:

现在让我们来看看前面提到的await方法。下面一个程序清单给出了解释。

Listing 1.1. The HttpServer class' await method

await方法是通过创建一个ServerSocket实例而开始的。然后它进入了一个WHILE循环:

在收到一个请求后,await方法从accept方法返回的socket实例中获得java.io.InputStreamjava.io.OutputStream对象。

await于是就创建一个Request对象并调用它的 parse 方法来解析原始的HTTP请求信息。

接下来,await 方法创建了一个Response 对象,使用setRequest方法并调用它的sendStaticResource 方法。

最后,await关闭该Socket。调用Request的getUri方法来检查HTTP请求的URI是否是一个shutdown命令。如果是,shutdown变量被设置为true,程序退出while循环。

利用socket自己实现基于HTTP协议的Web服务器

在开发网站的过程中,首先我们需要配置一个web服务器,一般会使用Apache这个开源的服务器软件,扩展性高,支持性也很好。实际上如果是windows系统的话那么也可以使用windows操作系统提供的I...
  • bobopeng
  • bobopeng
  • 2014年01月14日 11:26
  • 2662

【web开发原理】B/S架构原理分析

Web的工作原理 1.工作过程:如下图所示描述了Web的工作原理。   (1) 用户打开计算机(客户机),启动浏览器程序,并在浏览器中指定一个URL(Uniform Resource Locator...
  • moshenglv
  • moshenglv
  • 2016年07月08日 19:22
  • 6372

Web Service 实现分布式服务的基本原理

webservice如何实现分布式服务的
  • UUIDAndUID
  • UUIDAndUID
  • 2017年03月05日 00:27
  • 1521

深入分析java web 的ClassLoader工作机制(一)

一、ClassLoader简介: ClassLoader是类加载器, 责任1.将Class加载到JVM中, 责任2.审查每个类应该由谁加载, 责任3.将Class字节码重新解析成JVM...
  • Darrensty
  • Darrensty
  • 2017年11月30日 22:29
  • 20

Java学习笔记-Struts2工作机制

1.Servlet Filter(过滤器)技术:Servlet过滤器是在Java Servlet规范中定义的,它能够对过滤器关联的URL请求和相应进行检查和修改。 过滤器的用处: (1)权限控制。...
  • newleanerhao
  • newleanerhao
  • 2016年03月27日 16:38
  • 269

基于H.264的流媒体服务器的工作机制和实现方法

  • 2013年06月17日 10:34
  • 255KB
  • 下载

rabbitMQ消息服务器学习笔记(java)2 工作队列

既是自己的学习笔记又转自我老师的博客:http://blog.csdn.net/chwshuang/article/details/50506284 工作队列 1、在第一个教程中,我们编写了...
  • liangwanmian
  • liangwanmian
  • 2017年11月13日 20:48
  • 94

java脱离J2EE写的web服务器模拟Tomcat、struts 和 hibernate

  • 2011年09月21日 16:50
  • 1.36MB
  • 下载

软件开发工程师(JAVA)中级考试大纲之--五 J2EE WEB高级组件开发--(三)Tomcat服务器的环境及配置;应用发布和数据源配置;

首先定义tomcat6的安装根目录为 ${CATALINA_HOME} 在tomcat6版本中,context元素已经从server.xml文件中独立出来了,放在一个context.xml文件中。因...
  • liuganggao
  • liuganggao
  • 2015年03月04日 16:54
  • 1100

2.java web--搭建JavaWeb应用开发环境——Tomcat服务器

1.下载和安装Tomcat服务器   Tomcat官方站点:http://jakarta.apache.org   下载Tomcat安装程序包:http://tomcat.apache.org/ ...
  • wylong1991
  • wylong1991
  • 2017年11月22日 10:08
  • 148
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于JAVA的WEB服务器工作机制(2)
举报原因:
原因补充:

(最多只允许输入30个字)