这是目前的理解

附上服务端源码

package com.lsw.server;

import java.io.*;
import java.net.*;
import java.util.HashMap;
import java.util.Map;
/*
* 关于服务器,除了httpServer1类,还定义了一个Servlet接口,这个接口有一个init()和一个service()方法
* init()方法为初始化方法,当HTTPServer1类创建了该接口的类的一个实例后,就会立即调用该实例的init()方法
* service()方法:用户响应HTTP的请求,产生具体的HTTP响应结果。
* HTTPServer1服务器在响应HTTP请求时会调用servlet接口的特定类的service()方法
* 所谓web服务器动态执行程序代码。在这个例子中就是指httpServer1在运行时动态加载Servlet接口的实现类,创建他的实例。然后调用他的相关方法。
* HTTPServer1在其实现中利用了java语言的动态加载类的功能
*/
//动态执行
public class HTTPServer1 {
//存放selvlet实例的缓存
private static Map servletCache = new HashMap(); public static void main(String[] args){
int port;
ServerSocket serverSocket; try{
port = Integer.parseInt(args[0]);
System.out.println("默认端口是: " + port);
}
catch(Exception e){
System.out.println("默认端口8080");
port = 8080;
} try{
//创建监听端口
serverSocket = new ServerSocket(port);
System.out.println("服务器正在监听端口: " + serverSocket.getLocalPort());
while(true){
try{
//等待客户的链接请求
final Socket socket = serverSocket.accept();
System.out.println("建立了一个与客户的新的TCP连接,该客户的地址为: " + socket.getInetAddress()
+ " 端口为 : " + socket.getPort());
//响应客户请求
service(socket);
}
catch(Exception e){
e.printStackTrace();
}
} }
catch(Exception e){
e.printStackTrace();
}
} public static void service(Socket socket) throws Exception{
//读取HTTP请求信息
InputStream socketIn = socket.getInputStream(); //获得输入流
//睡眠500毫秒,等待http请求
Thread.sleep(500);
int size = socketIn.available();
byte[] buffer = new byte[size];
socketIn.read(buffer);
String request = new String(buffer);
//打印http请求数据
System.out.println("客户端请求的数据为: " +request); //解析http请求
//获得http请求第一行
String firstLineOfRequest = request.substring(0,request.indexOf("\r\n"));
System.out.println("firstLineOfRequest= " +firstLineOfRequest);
//解析http请求的第一行
String[] parts = firstLineOfRequest.split(" ");
//解析http请求这种的uri
String uri = parts[1];
System.out.println("解析http请求这种的uri=" + uri);
System.out.println("截图的值为=" + uri.substring(0, 1).toString());
String flag = uri.substring(0, 1).toString();
if(flag.equals("/")){
System.out.println("此请求是从浏览器发起的请求");
uri = uri.substring(1).toString();
} System.out.println("解析http请求这种的uri=" + uri); //如果请求调用servlet,则动态调用servlet的service方法
if(uri.indexOf("HttpTest") != -1){
//获得servlet的名字
String servletName = null;
if(uri.indexOf("?") != -1)
servletName = uri.substring(uri.indexOf("HttpTest/")+8, uri.indexOf("?"));
else
servletName = uri.substring(uri.indexOf("HttpTest/")+8, uri.length());
flag = "";
flag = servletName.substring(0, 1).toString();
if(flag.equals("/")){
servletName = servletName.substring(1).toString();
}
//尝试从servlet缓存中回去servlet对象
Servlet servlet = (Servlet)servletCache.get(servletName);
//如果servlet缓存在这种不存在servlet对象,则创建他,并把他放在servlet缓存中
if(servlet == null){
servlet = (Servlet)Class.forName("com.lsw.server."+servletName).newInstance();
servlet.init();
servletCache.put(servletName, servlet);
} //调用servlet的service()方法
servlet.service(buffer, socket.getOutputStream()); //睡眠1秒等待接收http响应结果
Thread.sleep(1000);
socket.close();
return ;
} } }

接口源码

package com.lsw.server;

import java.io.OutputStream;

public interface Servlet {
public void init() throws Exception;
public void service(byte[] requestBuffer,OutputStream out) throws Exception; }

实现类源码

package com.lsw.server;

import java.io.OutputStream;

public class HelloServlet implements Servlet {

    @Override
public void init() throws Exception {
System.out.println("HelloServlet is inited"); } @Override
public void service(byte[] requestBuffer, OutputStream out)
throws Exception {
String request = new String(requestBuffer);
//打印http请求数据
System.out.println("客户端请求的数据为: " +request); //解析http请求
//获得http请求第一行
String firstLineOfRequest = request.substring(0,request.indexOf("\r\n"));
System.out.println("firstLineOfRequest= " +firstLineOfRequest);
//解析http请求的第一行
String[] parts = firstLineOfRequest.split(" ");
//获得http请求中的请求方式
String method = parts[0];
System.out.println("解析http请求方式method=" + method);
//解析http请求这种的uri
String uri = parts[1];
System.out.println("解析http请求这种的uri=" + uri);
System.out.println("截图的值为=" + uri.substring(0, 1).toString());
String flag = uri.substring(0, 1).toString();
if(flag.equals("/")){
System.out.println("此请求是从浏览器发起的请求");
uri = uri.substring(1).toString();
} System.out.println("解析http请求这种的uri=" + uri); //获得请求参数username
String username = null;
//如果请求方式为get,则请求参数紧跟http请求的第一行的uri的后面
if(method.equalsIgnoreCase("get") && uri.indexOf("username=")!=-1){
//假定uri="servlet/HelloServlet?username=Tom&password=1234"
//parameters="username=Tom&password=1234"
String parameters = uri.substring(uri.indexOf("?"),uri.length());
//parts={"username=Tom","password=1234"}
parts = parameters.split("&");
//parts={"username","Tom"}
parts = parts[0].split("=");
username = parts[1];
} //如果请求方式为POST,则请求参数位于http请求的正文中
if(method.equalsIgnoreCase("post")){
int locate = request.indexOf("\r\n\r\n");
//获得响应正文
String content = request.substring(locate+4,request.length());
if(content.indexOf("username=")!=-1){
//假定content="username=Tom&password=1234"
//parts="username=Tom&password=1234"
parts = content.split("&");
parts = parts[0].split("=");
username = parts[1];
}
} //创建发送响应的http响应
//发送http响应第一行"
out.write("HTTP/1.1 200 OK\r\n".getBytes());
//发送http响应头
out.write("Content-Type:text/html\r\n\r\n".getBytes());
//发送http响应正文
out.write("<html><head><title>HelloWorld</title></head></body>".getBytes());
out.write(new String("<h1>Hello:" + username + "</h1></body></head></html>").getBytes());
} }

web到service简单原理例子的更多相关文章

  1. Web Service简单入门示例

    Web Service简单入门示例     我们一般实现Web Service的方法有非常多种.当中我主要使用了CXF Apache插件和Axis 2两种. Web Service是应用服务商为了解决 ...

  2. .NET Web开发技术简单整理

    在最初学习一些编程语言.一些编程技术的时候,做的更多的是如何使用该技术,如何更好的使用该技术解决问题,而没有去关注它的相关性.关注它的理论支持,这种学习技术的方式是短平快.其实工作中有时候也是这样,公 ...

  3. Web服务器的工作原理

    Web服务器的工作原理 Web服务器工作原理概述 很多时候我们都想知道,web容器或web服务器(比如Tomcat或者jboss)是怎样工作的?它们是怎样处理来自全世界的http请求的?它们在幕后做了 ...

  4. Spring-Context之一:一个简单的例子

    很久之前就想系统的学习和掌握Spring框架,但是拖了很久都没有行动.现在趁着在外出差杂事不多,就花时间来由浅入深的研究下Spring框架.Spring框架这几年来已经发展成为一个巨无霸产品.从最初的 ...

  5. 转载:.NET Web开发技术简单整理

    在最初学习一些编程语言.一些编程技术的时候,做的更多的是如何使用该技术,如何更好的使用该技术解决问题,而没有去关注它的相关性.关注它的理论支持,这种学习技术的方式是短平快.其实工作中有时候也是这样,公 ...

  6. Knockout, Web API 和 ASP.Net Web Forms 进行简单数据绑定

    使用Knockout, Web API 和 ASP.Net Web Forms 进行简单数据绑定   原文地址:http://www.dotnetjalps.com/2013/05/Simple-da ...

  7. S3 服务(Simple Storage Service简单存储服务) 简介(与hdfs同一级)

    图1  spark 相关 亚马逊云存储之S3(Simple Storage Service简单存储服务) (转 ) S3是Simple Storage Service的缩写,即简单存储服务.亚马逊的名 ...

  8. 跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击

    跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击 一.总结 一句话总结:比如用户留言功能,用户留言中写的是网页可执行代码,例如js代码,然后这段代码在可看到这段留言的不同一户的显示上就会 ...

  9. .NET Web开发技术简单整理 转

    .NET Web开发技术简单整理 原文:http://www.cnblogs.com/SanMaoSpace/p/3157293.html 在最初学习一些编程语言.一些编程技术的时候,做的更多的是如何 ...

随机推荐

  1. How to Tell Science Stories with Maps

    Reported Features How to Tell Science Stories with Maps August 25, 2015   Greg Miller This map, part ...

  2. core EFCore 开始尝试

    准备工作: 工程:core + console 引用包: Install-Package Microsoft.EntityFrameworkCore Install-Package Microsoft ...

  3. urllib模块和urllib2模块的区别

    一开始我以为urllib2模块单纯是urllib模块的升级版,因为我看到它们都有urlopen方法,但是经过查找资料,发现两者差别还是很大的. 这是我在网上看到的总结: urllib2可以接受一个Re ...

  4. iOS学习笔记(2)— UIView用户事件响应

    UIView除了负责展示内容给用户外还负责响应用户事件.本章主要介绍UIView用户交互相关的属性和方法. 1.交互相关的属性 userInteractionEnabled 默认是YES ,如果设置为 ...

  5. Hadoop(二):MapReduce程序(Java)

    Java版本程序开发过程主要包含三个步骤,一是map.reduce程序开发:第二是将程序编译成JAR包:第三使用Hadoop jar命令进行任务提交. 下面拿一个具体的例子进行说明,一个简单的词频统计 ...

  6. OR 连接查询注意

    用or 查询时, 取得是 每个or中条件的 查询的结果集union. select * from categorysecond t where ISNULL(null); ort.csid in (' ...

  7. No.16 selenium学习之路之异常处理

    一.常见的几种异常: SyntaxError:语法错误 NameError:试图访问的变量名不存在 IndexError:索引错误,使用的索引不存在,超出序列范围 KeyError:使用了不存在的关键 ...

  8. python基础学习之路No.3 控制流if,while,for

    在学习编程语言的过程中,有一个很重要的东西,它就是判断,也可以称为控制流. 一般有if.while.for三种 ⭐if语句 if语句可以有一个通俗的解释,如果.假如 如果条件1满足,则…… 如果条件2 ...

  9. Luogu P2310 【loidc,看看海】

    各位大佬都用的排序和杨颙大定理,蒟蒻的我怎么也不会做(瑟瑟发抖),那么,就来一发主席树吧.我们知道线段树可以维护区间,平衡树可以维护值域那么,我们可以用线段树套平衡树来解决这个区间值域的问题线段树套平 ...

  10. matlab转python

    最近在做把matlab代码转成python代码,没有用过matlab,python也只是局限于爬虫,所以.... matlab与python最大的不同是,matlab的下标是从1开始的,python和 ...