java服务器的简单实现过程记录

作者:JokerJason 时间:2023-01-18 06:44:34 

 一、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\r\n" +
    "Content-Type: text/html\r\n" +
    "Content-Length: 23\r\n" +
    "\r\n" +
    "
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,就能看到服务器响应的结果了。

来源:https://www.cnblogs.com/jokerjason/p/5838569.html

标签:java,http,服务器
0
投稿

猜你喜欢

  • Android 5.0+ 屏幕录制实现的示例代码

    2023-11-19 13:02:30
  • Spring定时任务无故停止又不报错的解决

    2021-06-06 08:41:27
  • SpringBoot集成Spring security JWT实现接口权限认证

    2023-02-02 07:31:08
  • 解决eclipse上传svn忽略target文件夹的坑

    2023-09-12 04:04:23
  • Android编程实现拦截短信并屏蔽系统Notification的方法

    2022-09-16 01:55:14
  • android连接wifi时获取广播地址代码

    2022-11-20 13:08:32
  • Android用MVP实现一个简单的类淘宝订单页面的示例

    2022-09-20 06:21:01
  • springboot使用单元测试实战

    2023-05-17 11:55:29
  • 浅谈MyBatis3 DynamicSql风格语法使用指南

    2023-11-25 13:05:06
  • Android(2.2/2.3系统)Gallery解决默认和横竖屏切换选中状态问题

    2022-09-30 19:06:18
  • Spring事务管理配置文件问题排查

    2022-07-04 15:55:25
  • Struts2学习笔记(5)-参数传递方法

    2023-08-30 13:03:21
  • Android界面一键变灰开发深色适配模式编程示例

    2021-11-25 04:22:25
  • Winform中GridView分组排序功能实现方法

    2022-01-29 16:20:03
  • SpringBoot整合支付宝APP支付

    2021-10-12 02:57:24
  • springboot项目快速搭建的方法步骤

    2021-11-07 04:55:51
  • Spring+SpringMVC+MyBatis深入学习及搭建(三)之MyBatis全局配置文件解析

    2022-03-21 05:25:23
  • Java应用多机器部署解决大量定时任务问题

    2023-10-28 17:07:17
  • C# http系列之以form-data方式上传多个文件及键值对集合到远程服务器

    2023-03-19 17:28:20
  • Springboot启动流程详细分析

    2023-11-29 00:23:10
  • asp之家 软件编程 m.aspxhome.com