http数据包装

HTTP请求与响应头:
HTTP是一个纯文本协议,工作模式是请求/响应模式。
一个请求由四个部分组成:请求行(必须)、请求头标、空行(必须)和请求数据
1.请求行:请求行由三个标记组成:请求方法、请求URI和HTTP版本,它们用空格分隔。
例如:GET /index.html HTTP/1.1
HTTP规范定义了8种可能的请求方法:
GET 检索URI中标识资源的一个简单请求
HEAD 与GET方法相同,服务器只返回状态行和头标,并不返回请求文档
POST 服务器接受被写入客户端输出流中的数据的请求
PUT 服务器保存请求数据作为指定URI新内容的请求
DELETE 服务器删除URI中命名的资源的请求
OPTIONS 关于服务器支持的请求方法信息的请求
TRACE Web服务器反馈Http请求和其头标的请求
CONNECT 已文档化但当前未实现的一个方法,预留做隧道处理
2.请求头标:由关键字/值对组成,每行一对,关键字和值用冒号(:)分隔。
请求头标通知服务器有关于客户端的功能和标识,典型的请求头标有:
User-Agent 客户端厂家和版本
Accept 客户端可识别的内容类型列表
Content-Length 附加到请求的数据字节数

3.空行:最后一个请求头标之后是一个空行,发送回车符和退行,通知服务器以下不再有头标。
4.请求数据:使用POST传送数据,最常使用的是Content-Type和Content-Length头标。

一个响应由四个部分组成;状态行、响应头标、空行、响应数据(正文)
1.状态行:状态行由三个标记组成:HTTP版本、响应代码和响应描述。
HTTP版本:向客户端指明其可理解的最高版本。
响应代码:3位的数字代码,指出请求的成功或失败,如果失败则指出原因。
响应描述:为响应代码的可读性解释。
例如:HTTP/1.1 200 OK
HTTP响应码:
1xx:信息,请求收到,继续处理
2xx:成功,行为被成功地接受、理解和采纳
3xx:重定向,为了完成请求,必须进一步执行的动作
4xx:客户端错误:
2.响应头标:像请求头标一样,它们指出服务器的功能,标识出响应数据的细节。
3.空行:最后一个响应头标之后是一个空行,发送回车符和退行,表明服务器以下不再有头标。使用它可以分离响应头与正文
4.响应数据:HTML文档和图像等,也就是HTML本身。

以下是使用java通过socket发送http请求并读取响应内容:
public class HttpTest{
public static void main(String args[]){
Socket client=null;
try {
client=new Socket("www.sina.com",80);
OutputStream dos=client.getOutputStream();
dos.println("POST /MyTest/Pushlet HTTP/1.1");//请求行
dos.println("host: www.sina.com");//请求头标,不加这个有时候无法得到响应数据,可能是因为服务器http协议版本的问题
dos.println();//添加一个空行
dos.flush();
BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
String s=null;
boolean isContent=false;
while((s=in.readLine())!=null){
System.out.println(s);
}
in.close();
}catch (Exception e) {
e.printStackTrace();
}

}

接下来,把自己的数据打包成http请求或响应包,这样在自己的C/S程序中通信的时候就可以避免防火墙的阻拦了。说明:只有在客户端与服务器端不在同一个局域网中的时候才需要考虑防火墙的阻拦!

HTTPWrapFactory.java
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class HTTPWrapFactory extends WrapFactory{
//简单的请求头,只有请求行和空行是必须的,可以自行定义
public static String GET_HEADER="GET / HTTP/1.1/r/nhost: www.sina.com/r/nConnection: Close/r/n/r/n";
//响应头
public static String RESPONSE_HEADER="HTTP/1.0 200 OK";

public byte[] getContentFromRequest(byte[] datas) {//从请求包中提取正文
// TODO 自动生成方法存根
int header_size=GET_HEADER.length();
byte[] temp=new byte[datas.length-header_size];
for(int i=0;i<temp.length;i++){
temp[i]=datas[i+header_size];
}
return temp;
}
public byte[] getContentFromResponse(byte[] datas) {//从响应包中提取正文
// TODO 自动生成方法存根
int header_size=RESPONSE_HEADER.length();
byte[] temp=new byte[datas.length-header_size];
for(int i=0;i<temp.length;i++){
temp[i]=datas[i+header_size];
}
return temp;
}
public byte[] getRequest(byte[] datas) {//将数据打包为http请求包
// TODO 自动生成方法存根
//byte[] temp=new byte[1024];
ByteArrayOutputStream bout=new ByteArrayOutputStream();
try {
bout.write(GET_HEADER.getBytes());
bout.write(datas);
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}

return bout.toByteArray();
}
public byte[] getResponse(byte[] datas) {//将数据打包为http响应包
// TODO 自动生成方法存根
ByteArrayOutputStream bout=new ByteArrayOutputStream();
try {
bout.write(RESPONSE_HEADER.getBytes());
bout.write(datas);
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}

return bout.toByteArray();
}
public static void main(String[] args) {
WrapFactory wrap=HTTPWrapFactory.getInstance("com.yxw.helper.HTTPWrapFactory");
byte[] datas=wrap.getResponse("this is a test!".getBytes());
System.out.println(new String(wrap.getContentFromResponse(datas)));
}
}

WrapFactory.java
public abstract class WrapFactory {

private static WrapFactory wrapFactory;

public static WrapFactory getInstance(String className){
if(wrapFactory==null){
try {
wrapFactory=(WrapFactory) Class.forName(className).newInstance();
} catch (InstantiationException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
return wrapFactory;
}
public abstract byte[] getRequest(byte[] datas);
public abstract byte[] getResponse(byte[] datas);
public abstract byte[] getContentFromRequest(byte[] datas);
public abstract byte[] getContentFromResponse(byte[] datas);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值