日期:2014-05-20  浏览次数:20690 次

如何用java 模拟发送 HTTP数据包, 该如何处理
想实现模拟发送http数据包, 我的理解是这样: 用class 来构造http数据包的头部和 body。
body的部分我是想讲一个文件按照byte 输入。 

然后来发送。

问题是: OutputStream.write() 处理的是byte。 

我如何将我构造的http数据包的类对象 变成 byte, 然后给write 写入buffer中? 

是要将每个变量 挨个加起来吗? 还是有其他的办法? 

如果能给个类似的例子 就更好了。 


谢谢 


------解决方案--------------------
那只能给你点片段核心代码,你自己好好看看,SOCKET模拟HTTP的请求:
 StringBuilder header = new StringBuilder();
BufferedReader br = null;
BufferedWriter bw = null;
StringBuilder accept = new StringBuilder("GET / HTTP/1.1\r\n");
accept.append("User-Agent: Java/1.6.0_20\r\n");
accept.append("Host: "+domain.getDomainname()+":"+domain.getPort()+"\r\n");
accept.append("Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n");
accept.append("Connection: Close\r\n");
accept.append("\r\n");
try {

Socket socket = new Socket();

//socekt连接ip,port,5秒钟后没有连接指定ip则跑出SocketTimeOutException异常,表示连接超时
socket.connect(new InetSocketAddress(InetAddress.getByName(domain.getIp()), domain.getPort()),5);
socket.setSoTimeout(5);
br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"GBK"));
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bw.write(accept.toString());
bw.flush();
String firstLine = br.readLine();
if(firstLine != null){
stateCode = Integer.parseInt(firstLine.split(" ")[1]);
header.append(firstLine);
}
state = (stateCode == 200)? 1 : 2;
String line = "";
while(!"".equals((line = br.readLine()))){
header.append(line+"\n");
}
------解决方案--------------------
你是说你创建一个类,将http各种参数赋给这个类,然后发送给接收方是可以的,用下面的方法将自定义类拆解成字节,然后发送这个类字节给接收方,接收方可以再转换成类就行了。不过还得调试调试。
ByteArrayOutputStream bao=new ByteArrayOutputStream();
ObjectOutputStream oop=new ObjectOutputStream(bao);
oop.writeObject(myClass);//这里把自定义类注入进去
ByteBuffer bba=ByteBuffer.wrap(bao.toByteArray());
这个bba就是类序列化后的字节,然后socket的send发送给对方,然后接收方可以再使用ObjectInPutStream再解析成自定义类。
那上面这种一般是TCP协议的socket程序互相发送自定义类的方法。



------解决方案--------------------
你要自己通过 Socket 来发送 HTTP 数据包?

哎,我看楼主还是不要费这个心了,简单的好弄的,但是要能应用于生产环境的,那可没有那么简单!

JDK 中有现成的 HttpURLConnection
Apache 中有现成的 HttpComponent, HttpClient 4.x
Apache Commons 中有现成的 HttpClient 3.x

有这么多现在的工具为什么不用呢?你认为你能写得比这里工具好?