web到service简单原理例子
这是目前的理解
附上服务端源码
- 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简单原理例子的更多相关文章
- Web Service简单入门示例
Web Service简单入门示例 我们一般实现Web Service的方法有非常多种.当中我主要使用了CXF Apache插件和Axis 2两种. Web Service是应用服务商为了解决 ...
- .NET Web开发技术简单整理
在最初学习一些编程语言.一些编程技术的时候,做的更多的是如何使用该技术,如何更好的使用该技术解决问题,而没有去关注它的相关性.关注它的理论支持,这种学习技术的方式是短平快.其实工作中有时候也是这样,公 ...
- Web服务器的工作原理
Web服务器的工作原理 Web服务器工作原理概述 很多时候我们都想知道,web容器或web服务器(比如Tomcat或者jboss)是怎样工作的?它们是怎样处理来自全世界的http请求的?它们在幕后做了 ...
- Spring-Context之一:一个简单的例子
很久之前就想系统的学习和掌握Spring框架,但是拖了很久都没有行动.现在趁着在外出差杂事不多,就花时间来由浅入深的研究下Spring框架.Spring框架这几年来已经发展成为一个巨无霸产品.从最初的 ...
- 转载:.NET Web开发技术简单整理
在最初学习一些编程语言.一些编程技术的时候,做的更多的是如何使用该技术,如何更好的使用该技术解决问题,而没有去关注它的相关性.关注它的理论支持,这种学习技术的方式是短平快.其实工作中有时候也是这样,公 ...
- Knockout, Web API 和 ASP.Net Web Forms 进行简单数据绑定
使用Knockout, Web API 和 ASP.Net Web Forms 进行简单数据绑定 原文地址:http://www.dotnetjalps.com/2013/05/Simple-da ...
- S3 服务(Simple Storage Service简单存储服务) 简介(与hdfs同一级)
图1 spark 相关 亚马逊云存储之S3(Simple Storage Service简单存储服务) (转 ) S3是Simple Storage Service的缩写,即简单存储服务.亚马逊的名 ...
- 跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击
跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击 一.总结 一句话总结:比如用户留言功能,用户留言中写的是网页可执行代码,例如js代码,然后这段代码在可看到这段留言的不同一户的显示上就会 ...
- .NET Web开发技术简单整理 转
.NET Web开发技术简单整理 原文:http://www.cnblogs.com/SanMaoSpace/p/3157293.html 在最初学习一些编程语言.一些编程技术的时候,做的更多的是如何 ...
随机推荐
- 算法: 排序: 归并排序(Merge)
http://www.codeproject.com/Articles/805587/Merge-Sort
- asp启用父路径
开启父路径后可以用../来表示上一层目录,如果网站程序中使用了../,不开启则网站程序里有../就会报错. IIS6启用父路径方法:打开IIS管理器——网站——右键属性——主目录——配置——选项——选 ...
- id=%d是什么意思呢?
$branch=M('Branchs')->where("id=%d",session('branchid'))->find(); %d代表,逗号后面那个user[]的 ...
- CSS基础之选择器
一:CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到,一个样式表时,就会按照. 二:CSS语法 每个CSS有两部分组成:选择器和声明 ...
- 【总结】前端框架:react还是vue?
之前写了一篇前端框架的大汇总,主要介绍了当下主流的框架和其特性.最近除了bootstrap,就属react和vue最为热门,这篇就主要拿这两个框架来做一下详细对比. 究竟如何正确使用?作为小白的我们从 ...
- 关于UDP数据报引发“异步错误”的疑问
在UNP卷一第三版的第8章8.9小节中说到:如果udp服务器没有启动,udp客户端在使用sendto发送一行文本后,将会等待一个永远也不会出现的应答从而阻塞在recvfrom调用上. 由于服务器段不存 ...
- 利用反射型XSS二次注入绕过CSP form-action限制
利用反射型XSS二次注入绕过CSP form-action限制 翻译:SecurityToolkit 0x01 简单介绍 CSP(Content-Security-Policy)是为了缓解XSS而存在 ...
- jQuery动态给下拉列表添加一个选项(创建DOM对象)
使用的函数:
- Spring4笔记2--Spring的第一个程序
Spring程序开发: 1. 导入jar包(略) 2. 创建Spring配置文件: Spring 配置文件的文件名可以随意,但 Spring 建议的名称为 applicationContext.xml ...
- connect by和strart with子句
--使用connect by和strart with子句 SELECT [level],column,expression, ... FROM table [WHERE where_clause] [ ...