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());
    }

}
时间: 2024-08-12 18:16:34

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

Web Service简单入门例子

我们一般实现Web Service的方法有很多种.其中我主要使用了CXF Apache插件和Axis 2两种. Web Service是应用服务商为了解决每个问题而提供的在线服务方案,其主要采用了SOAP(Simple Object Access Protocol)协议,数据传输格式使用XML格式来描述,因此也具有跨平台的特性. web广泛用到的技术: TCP/IP:通用网络协议,被各种设备使用 HTML(标准通用标记语言下的一个应用):通用用户界面,可以使用HTML标签显示数据 Java:写一

Spring MVC简单原理

Spring MVC简单原理 针对有Java Web基础.Spring基础和Spring MVC使用经验者,文章比较简单,权当自己的一个总结和备忘吧. 前言 目前基于Java的web后端,Spring生态应该是比较常见了.虽然现在流行前后端分离,MVC和后端模板渲染越来越少,后端专注向前端提供数据接口.但由于笔者维护着一个老项目,既有JSP技术也有只返回JSON的接口,两者都是基于Spring MVC这一套技术实现的,所以暂且觉得了解一下Spring MVC原理还是有所裨益的. Spring M

聊天室刷屏的简单原理实现

在聊天室中,如果我们想要实现刷屏的效果,其实很简单,因为这些我们都可以通过前台的js来完成. 首先,说一下原理,就是通过javascript来模拟文字的输入,来模拟提交按钮的点击.这里要实现这些,首先我们需要浏览器的debug,比如firefox的firebug,或者自带的调试工具也可,或者chrome的console台,ie+8的F12 开发者工具. 下面举个简单的例子: 首先审查元素,找到输入框的id比如:id="postTex"t, 然后找到提交的id或者css,比如 class

最近面试的题目(WEB、Service、SQL、JavaScript)

整理一下最近面试被问到的主要题目.由于本人主要是做WEB及WEB SERVICE这块,使用的语言主要是C#,数据库主要用到的也是MSSQL.所以就分成这些块来整理(有些是在面试之后才意识到回答不对),也包括部分别人被问及的. 一.HTML.CSS position有哪几种值,各是怎么使用的? 一个左右部局,如何实现? 二.JAVASCRIPT, JS FRAMEWORK document.onload与jQuery中的ready有何区别? 什么是闭包?写一下. jQuery中有个叫"on&quo

Web程序的运行原理及流程(一)

自己做Web程序的开发也有两年多了 从最开始跟风学框架  到第一用上框架的欣喜若狂 我相信每个程序员都是这样过来的 在大学学习一门语言 学会后往往很想做一个实际的项目出来  我当时第一次做WEB项目看的书是struts2 + spring + hibernate 从入门到精通 迷迷糊糊的看完了  顺着步骤一步步搭建环境  也不知道花了多久才跑通  其实框架帮我做了很多事情 我自己那个时候都不知道 现在 我建议使用框架的同时 多注意框架到底帮你做了什么 这对一个web程序员的进阶非常重要 以后也会

C#调用存储过程简单完整例子

CREATE PROC P_TEST@Name VARCHAR(20),@Rowcount INT OUTPUTASBEGIN SELECT * FROM T_Customer WHERE [email protected] SET  @[email protected]@ROWCOUNTENDGO------------------------------------------------------------------------------------------存储过程调用如下:-

javaweb简单登陆例子

JSP+Servlet+JavaBean简单程序例子——用户名密码登陆,摘自<Tomcat&JavaWeb 技术手册>,亲测可用. IDE环境:MyEclipse10 1.建立Web Project,命名为Login_test.创建userLogn表: create table userLogin( user_name varchar(10) not null, user_pwd varchar(10) not null, constraint user_pk primary key

插件的简单原理

using IExtendServices; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace 插件的简单原理 { public class ExtendSe

Server 2005之Integration Service简单实例

SSIS(SQL Server Integration Service)是在SQL Server2000的DTS的基础上做的一个非常大的改进的新工具.采用了数据流和控制流分离,设计和部署分离的架构设计,引入了更多新的转换,终于向着专业级的ETL工具迈了一大部.   由于相对DTS的改进非常大,开发和使用SSIS也就显得比DTS略显复杂.但是对于大型项目,实际上SSIS比DTS要简单的多. 本文通过一个最简单的例子,演示了开发和部署一个SSIS Package的整个过程. 1.开发   SQL S