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协议给服务器 。