这是目前的理解

附上服务端源码

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. numpy基础整理

    记笔记用jupyter实在太方便了,懒得再重新写到博客园上,直接放个链接吧→_→ numpy(一):https://douzujun.github.io/page/%E6%95%B0%E6%8D%AE ...

  2. 【学习笔记】初识FreeMarker简单使用

    楔子: 之前在和同事讨论,同事说“jsp技术太古老了,有几种页面技术代替,比如FreeMarker.Velocity.thymeleaf,jsp快废弃了……”云云.我这一听有点心虚……我在后端部分越刨 ...

  3. Python 豆瓣顶帖

    由于在豆瓣发了个租房帖子,发现很快就被其他的帖子淹没,但是手动顶帖实在太累,

  4. .NET 定时器类及使用方法

    Timer类实现定时任务 //2秒后开启该线程,然后每隔4s调用一次 System.Threading.Timer timer = new System.Threading.Timer((n) =&g ...

  5. [整理]内存重叠之memcpy、memmove

    函数原型: void *memcpy( void *dest, const void *src, size_t count ); void *memmove( void* dest, const vo ...

  6. UCenter在JAVA项目中实现的单点登录应用实例

    Comsenz(康盛)的UCenter当前在国内的单点登录领域占据绝对份额,其完整的产品线令UCenter成为了账号集成方面事实上的标准. 基于UCenter,可以将Comsenz旗下的Discuz! ...

  7. 微信小程序开发教程(七)逻辑层——.js详解

    逻辑层,是事务逻辑处理的地方.对于小程序而言,逻辑层就是.js脚本文件的集合.逻辑层将数据进行处理后发送给视图层,同时接收视图层的事件反馈. 微信小程序开发框架的逻辑层是由JavaScript编写.在 ...

  8. addclass,removeclass

    定义和用法 addClass() 方法向被选元素添加一个或多个类. 该方法不会移除已存在的 class 属性,仅仅添加一个或多个 class 属性. 提示:如需添加多个类,请使用空格分隔类名. rem ...

  9. HDU 1019 Least Common Multiple GCD

    解题报告:求多个数的最小公倍数,其实还是一样,只需要一个一个求就行了,先将答案初始化为1,然后让这个数依次跟其他的每个数进行求最小公倍数,最后求出来的就是所有的数的最小公倍数.也就是多次GCD. #i ...

  10. [转]程序进行性能分析工具gprof使用入门

    性能分析工具 软件的性能是软件质量的重要考察点,不论是在线服务程序还是离线程序,甚至是终端应用,性能都是用户体验的关键.这里说的性能重大的范畴来讲包括了性能和稳定性两个方面,我们在做软件测试的时候也是 ...