zoukankan      html  css  js  c++  java
  • java服务器简单实现

    一 HTTP
     http请求
     一般一个http请求包括以下三个部分:
     1 请求方法,如get,post
     2 请求头

     
    3 实体
     
    一个http请求的实例如下:
    GET /index.jsp HTTP/1.1
    Host: localhost:8080
    User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/15.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Connection: keep-alive
    注意红色部分的url,这是我们待会要截取出来的。
     http响应
    与http请求类似,http响应也包括三个部分
    1 协议-状态码-描述
    2 响应头
    3 响应实体段

    二 socket类
    套接字是网络连接的断点。套接字使得应用程序可以从网络中读取数据,可以向网络中写入数据。不同计算机上的应用程序可以通过套接字发送或接受字节流。java中提供了Socket类来实现这个功能,通过getInputStream和getOutputStream可以获取网络中的输入输出流。
      但是,光靠Socket类还是不能够实现我们构建一个服务器应用程序的功能的,因为服务器必须时刻待命,因此java里面提供了ServerSocket类来处理等待来自客户端的请求,当ServerSocket接受到了来自客户端的请求之后,它就会创建一个实例来处理与客户端的通信。
     
    三 服务器应用程序的实现
    首先,我们要构建一个封装请求信息的类requst,一个响应请求的类response,还要有一个主程序httpServer来处理客户端来的请求。

    package com.lwq;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    /**
     * @author Joker
     * 类说明
     * 将浏览器发来的请求信息转化成字符和截取url
     */
    public class Request {
        
        //输入流
        private InputStream input;
        //截取url,如http://localhost:8080/index.html ,截取部分为 /index.html
        private String uri;
        public Request(InputStream inputStream){
            this.input = inputStream;
        }
        
        public InputStream getInput() {
            return input;
        }
        public void setInput(InputStream input) {
            this.input = input;
        }
        public String getUri() {
            return uri;
        }
        public void setUri(String uri) {
            this.uri = uri;
        }
        
        //从套接字中读取字符信息
        public void parse(){
            
                StringBuffer request = new StringBuffer(2048);
                int i = 0;
                byte[] buffer = new byte[2048];
                
                try {
                    i = input.read(buffer);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    i = -1;
                }
                for(int j = 0;j<i;j++){
                        request.append((char)(buffer[j]));
                }
                System.out.println(request.toString());
                uri = parseUri(request.toString());
                }
        //截取请求的url
        private String parseUri(String requestString){
            
            int index1 = 0;
            int index2 = 0;
            index1 = requestString.indexOf(' ');
            if(index1!=-1){
                index2 = requestString.indexOf(' ',index1+1);
                if(index2>index1){
                    return requestString.substring(index1+1,index2);
                }
            }
            
            return null;
        }
                
                
                
            
        }

    下面是封装了响应请求的类response:

    package com.lwq;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    
    /**
     * @author Joker
     * @version 创建时间:Sep 5, 2012 9:59:53 PM
     * 类说明 根据相应信息返回结果
     */
    public class Response {
        
        private static final int BUFFER_SIZE = 1024;
        Request request;
        OutputStream output;
        public Response(OutputStream output){
            this.output = output;
        }
        
        public void sendStaticResource() throws IOException{
            
            byte[] bytes = new byte[BUFFER_SIZE];
            FileInputStream fis = null;
            
            File file = new File(HttpServer.WEB_ROOT,request.getUri());
            if(file.exists()){
                try {
                    fis = new FileInputStream(file);
                    int ch = fis.read(bytes,0,BUFFER_SIZE);
                    while(ch != -1){
                        output.write(bytes,0,ch);
                        ch = fis.read(bytes,0,BUFFER_SIZE);
                    }
                    
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }catch(IOException e){
                    e.printStackTrace();
                }finally{
                    if(fis !=null){
                        fis.close();
                    }
                }
                
            }else{
                //找不到文件
                 String errorMessage = "HTTP/1.1 404 File Not Found
    " +
         "Content-Type: text/html
    " +
         "Content-Length: 23
    " +
         "
    " +
         "
    File Not Found
    ";
                 try {
                    output.write(errorMessage.getBytes());
                    output.flush();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        public Request getRequest() {
            return request;
        }
        public void setRequest(Request request) {
            this.request = request;
        }
        public OutputStream getOutput() {
            return output;
        }
        public void setOutput(OutputStream output) {
            this.output = output;
        }
        public static int getBUFFER_SIZE() {
            return BUFFER_SIZE;
        }
        
        
    
    }

    接下来是主程序,

    package com.lwq;
    
    import java.io.File;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @author Joker
     * 类说明
     */
    public class HttpServer {
    
        /**
         * @param args
         */
        
        //WEB_ROOT是服务器的根目录
        public static final String WEB_ROOT = System.getProperty("user.dir")+File.separator+"webroot";
        
        //关闭的命令
        private static final String SHUTDOWN_COMMAND= "/SHUTDOWN";
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            HttpServer server = new HttpServer();
            server.await();
    
        }
        public void await(){
            ServerSocket serverSocket = null;
            int port = 8080;
            try {
                serverSocket = new ServerSocket(port,1,InetAddress.getByName("127.0.0.1"));
                while(true)
                {
                    try {
                Socket socket = null;
                InputStream input = null;
                OutputStream output = null;
                socket = serverSocket.accept();
                input = socket.getInputStream();
                output = socket.getOutputStream();
                //封装request请求
                Request request = new Request(input);
                request.parse();
                //封装response对象
                Response response = new Response(output);
                response.setRequest(request);
                response.sendStaticResource();
                socket.close();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        continue;
                    }
                
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            
            
        }
        
    
    }

    运行httpServer,在浏览器中打下http://localhost:8080/index.jsp,就能看到服务器响应的结果了。

  • 相关阅读:
    Vsftpd 3.0.2 正式版发布
    Putdb WebBuilder 6.5 正式版本发布
    SoaBox 1.1.6 GA 发布,SOA 模拟环境
    pynag 0.4.6 发布,Nagios配置和插件管理
    Percona Playback 0.4,MySQL 负荷回放工具
    xombrero 1.3.1 发布,微型 Web 浏览器
    Hypertable 0.9.6.4 发布,分布式数据库
    libmemcached 1.0.11 发布
    CryptoHeaven 3.7 发布,安全邮件解决方案
    Android Activity生命周期
  • 原文地址:https://www.cnblogs.com/jokerjason/p/5838569.html
Copyright © 2011-2022 走看看