当前位置: 首页 > 工具软件 > Min Browser > 使用案例 >

Mini浏览器(MiniBrowser)

扶杜吟
2023-12-01


import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MiniBrowser {
    public static void main(String[] args) throws Exception {
        String url = "xxxxxxxxxxxx";
        String contentString = getContentString( url ,false);
        System.out.println(contentString);
        String httpString = getHttpString(url, false);
        System.out.println(httpString);

    }

    public static byte[] getContentBytes(String url){
        return getContentBytes(url,false);
    }

    public static String getContentString(String url){
        return getContentString(url ,false);
    }

    private static String getContentString(String url, boolean gzip) {
        byte[] result = getContentBytes(url,gzip);
        if(null==result)
            return null;
        try{
            return new String(result,"utf-8").trim();//去掉字符串两旁空白字符与预定义字符
        } catch (UnsupportedEncodingException e) {
            return null;
        }
    }

    private static byte[] getContentBytes(String url, boolean gzip) {
        byte[] response = getHttpBytes(url, gzip);
        byte[] doubleReturn = "\r\n\r\n".getBytes();//双回车相当于分割线

        int pos = -1;
        for (int i = 0 ; i<response.length-doubleReturn.length;i++){
            byte[] temp = Arrays.copyOfRange(response,i,i+doubleReturn.length);//数组复制
            if(Arrays.equals(temp,doubleReturn)){
                pos = i ;
                break;
            }
        }
        if(-1==pos)
            return null;
        pos +=doubleReturn.length;
        byte[] result = Arrays.copyOfRange(response,pos,response.length);
        return result;
    }

    private static String getHttpString(String url) {
        return getHttpString(url,false);
    }

    private static String getHttpString(String url, boolean gzip) {
        byte[] bytes =  getHttpBytes(url, gzip);
        return new String(bytes).trim();
    }

    private static byte[] getHttpBytes(String url, boolean gzip) {
        byte[] result = null;
        try {
            URL u = new URL(url);
            Socket client = new Socket() ;
            int port = u.getPort();//提取端口号
            if (-1==port)
                port = 80;
            InetSocketAddress inetSocketAddress = new InetSocketAddress(u.getHost(),port);//使用getHost创建对象
            client.connect(inetSocketAddress,1000);//超时
            Map<String,String> requestHeader = new HashMap<>();
            requestHeader.put("Host", u.getHost()+":"+port);
            requestHeader.put("Accept","text/html");
            requestHeader.put("Connection","close");
            requestHeader.put("User-Agent","how2j mini brower / java1.8");

            if (gzip)
                requestHeader.put("Accept-Encoding","gzip");

            String path = u.getPath();
            if(path.length()==0)
                path = "/";

            String firstLine = "GET " + path + " HTTP/1.1\r\n";

            StringBuffer httpRequestString = new StringBuffer();
            httpRequestString.append(firstLine);
            Set<String> headers = requestHeader.keySet();
            for (String header : headers) {
                String headerLine = header + ":" + requestHeader.get(header)+"\r\n";
                httpRequestString.append(headerLine);
            }

            PrintWriter pWriter = new PrintWriter(client.getOutputStream(), true);
            pWriter.println(httpRequestString);
            InputStream is = client.getInputStream();

            int buffer_size = 1024;

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte buffer[] = new byte[buffer_size];
            while(true) {
                int length = is.read(buffer);
                if(-1==length)
                    break;
                baos.write(buffer, 0, length);
                if(length!=buffer_size)
                    break;
            }

            result = baos.toByteArray();
            client.close();
        }catch (Exception e){
            e.printStackTrace();
            try {
                result = e.toString().getBytes("utf-8");
            } catch (UnsupportedEncodingException e1) {
                e1.printStackTrace();
            }
        }
        return result;
    }




}

该demo主要提供:1 . getHttpBytes 返回二进制http 响应 ;
2 . getHttpString 返回字符串的http响应 ;
3. getContentBytes 返回二进制的响应内容 ;
4. getContentString 返回字符串的响应内容 ;
5. gzip参数 方便获取压缩后的数据 。

最核心的是 getHttpBytes ----》通过socket 发送http协议给服务器 。

 类似资料: