zoukankan      html  css  js  c++  java
  • 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("
    "));
            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("
    "));
            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("
    
    ");
                //获得响应正文
                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
    ".getBytes());
            //发送http响应头
            out.write("Content-Type:text/html
    
    ".getBytes());
            //发送http响应正文
            out.write("<html><head><title>HelloWorld</title></head></body>".getBytes());
            out.write(new String("<h1>Hello:" + username + "</h1></body></head></html>").getBytes());
        }
    
    }
  • 相关阅读:
    编写高质量代码改善C#程序的157个建议——建议34:为泛型参数设定约束
    编写高质量代码改善C#程序的157个建议——建议33:避免在泛型类型中声明静态成员
    编写高质量代码改善C#程序的157个建议——建议32:总是优先考虑泛型
    编写高质量代码改善C#程序的157个建议——建议31:在LINQ查询中避免不必要的迭代
    编写高质量代码改善C#程序的157个建议——建议30:使用LINQ取代集合中的比较器和迭代器
    编写高质量代码改善C#程序的157个建议——建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T>
    编写高质量代码改善C#程序的157个建议——建议28:理解延迟求值和主动求值之间的区别
    编写高质量代码改善C#程序的157个建议——建议27:在查询中使用Lambda表达式
    编写高质量代码改善C#程序的157个建议——建议26:使用匿名类型存储LINQ查询结果
    编写高质量代码改善C#程序的157个建议——建议25:谨慎集合属性的可写操作
  • 原文地址:https://www.cnblogs.com/batman425/p/7583284.html
Copyright © 2011-2022 走看看