JAVA使用Socket实现的简易HTTP服务器

本文介绍了一种使用Java Socket构建的非阻塞HTTP服务器,通过解析浏览器请求并封装成请求报文类,实现对外服务。服务器核心代码简洁,大约两百行,确保每个Socket都在独立线程中运行,避免阻塞问题。示例中,服务器能够本地提供静态HTML文件,并给出一个外网访问链接:http://coldcoding.picp.net:27227/test1.jpg,读者可以将此链接替换为自己的访问链接。
摘要由CSDN通过智能技术生成

用花生壳做好了外网访问链接
coldcoding.picp.net:27227
服务器核心代码两百行左右

非阻塞IO的方式解析浏览器请求,封装为请求报文类


import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

//由请求产生的Socket读取请求报文并解析成为Request
public class Request {
    private String method;      //请求方法  
    private String version;     //协议版本  
    private String requestURL;  //
    private String requestURI;  //请求的URI地址  在HTTP请求的第一行的请求方法后面  
    private String host;        //请求的主机信息  
    private String connection;  //HTTP请求连接状态信息 对应HTTP请求中的Connection  
    private String agent;       //代理,用来标识代理的浏览器信息 ,对应HTTP请求中的User-Agent:  
    private String language;    //对应Accept-Language  
    private String encoding;    //请求的编码方式  对应HTTP请求中的Accept-Encoding  
    private String charset;     //请求的字符编码  对应HTTP请求中的Accept-charset  
    private String accept;      //对应HTTP请求中的Accept;
    private int contentLength = 0;
    //一个请求可能包含的全部信息
    private InputStream reader;

    public Request(InputStream reader) throws IOException{
        this.reader = reader;

        this.getRequest();
    }
    //空白构造函数,用来自己构造请求消息
    public Request(){

    }

    private void getRequest() throws IOException{  
        /*解析请求报文,读取出消息体,不对消息体做解析*/
        String line = readLine(reader, 0);
        parser(line);
        do {  
            line = readLine(reader, 0);  
            //如果有Content-Length消息头时取出  
            if (line.startsWith("Content-Length")) {  
                contentLength = Integer.parseInt(line.split(":")[1].trim());  
            }  
            parser(line);
         } while (!line.equals("\r\n")); 
         if ("POST".equalsIgnoreCase(method)) {  
             /*TODO POST请求的消息体解析*/
             System.out.print(readLine(reader, contentLength));  
             System.out.println();  
         }  
        //reader.close();
        //client.close();
        //HTTP GET请求 Socket发送和接收公用同一个套接字,关闭则视为通信失败
    } 

     /* 
     Socket InputStream因为HTTP数据流没有结尾会陷入阻塞
     */  
    private 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值