社区
Java SE
帖子详情
如何用java 模拟发送 HTTP数据包, 该如何处理
suwy2007
2012-10-06 12:19:28
想实现模拟发送http数据包, 我的理解是这样: 用class 来构造http数据包的头部和 body。
body的部分我是想讲一个文件按照byte 输入。
然后来发送。
问题是: OutputStream.write() 处理的是byte。
我如何将我构造的http数据包的类对象 变成 byte, 然后给write 写入buffer中?
是要将每个变量 挨个加起来吗? 还是有其他的办法?
如果能给个类似的例子 就更好了。
谢谢
...全文
1261
13
打赏
收藏
如何用java 模拟发送 HTTP数据包, 该如何处理
想实现模拟发送http数据包, 我的理解是这样: 用class 来构造http数据包的头部和 body。 body的部分我是想讲一个文件按照byte 输入。 然后来发送。 问题是: OutputStream.write() 处理的是byte。 我如何将我构造的http数据包的类对象 变成 byte, 然后给write 写入buffer中? 是要将每个变量 挨个加起来吗? 还是有其他的办法? 如果能给个类似的例子 就更好了。 谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
suwy2007
2012-10-07
打赏
举报
回复
不是 准备用户生产环境。就是要模拟这个数据包 做一些实验。
谢谢楼上列出相关的类。
MiceRice
2012-10-06
打赏
举报
回复
没那么复杂,用开源的 HttpClient 包就行了,这些问题全都帮你处理好了。
POST 和 GET 都轻松搞定,可以Google下样例代码,大把大把的。
suwy2007
2012-10-06
打赏
举报
回复
谢谢各位的回答。 请问一下 abcmsnet:
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");
以上这个代码就是你模拟创建的 http数据包是吧?
这是一般的方法吗?
我的想法是 用一个类 来封装这些数据结构,然后发送。
其中 这个类的每个对象的内容都是变化的, 也就是 发送出去的 http
包都是不一样的。 我需要的就是这种效果。
那么我是不是先创建这个类,然后用你的办法,将所有的类变量append 到accept 中, 然后发送。
我的理解对吗?
我只是模拟http数据包的发送与接受,不用解包,只要收到就行。
杀手
2012-10-06
打赏
举报
回复
我猜楼主你是想模拟传输层传输,如果利用java好像只能通过byte传输,你可以写个方法将你的Http报文转成字符串形式,然后转换成byte数组传输
MiceRice
2012-10-06
打赏
举报
回复
楼主的要求比较怪异,既然只不过是两台电脑用TCP通讯,为啥你非要用HTTP协议呢?
建议直接抛开标准协议。建立Socket后,直接用ObjectOutputStream和ObjectInputStream包装下,就可以直接发送对象了(必须是可序列化的),简单又方便。
否则光协议解析和处理,就要浪费自己大量代码。
JavaNet的牛肉粉丝
2012-10-06
打赏
举报
回复
那只能给你点片段核心代码,你自己好好看看,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");
}
suwy2007
2012-10-06
打赏
举报
回复
不对啊 你这个还是 跟webserver 通信。
我说的不是这个意思。
我说的是自己构造http数据包后 如何通过 TCP socket发送出去。
JavaNet的牛肉粉丝
2012-10-06
打赏
举报
回复
使用HttpURLConnection就可以实现的,他们说的都不怎么靠谱,我直接给你点代码,给点分哈哈。
URL url = new URL("http://oa.opple.com/names.nsf?Login"); //提交的地址
//STEP.1.建立连接 POST /names.nsf?Login HTTP/1.1
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST"); //设置方法为Post
//STEP.2.设置Cookie 根据你的js做的
con.setRequestProperty("Cookie", "A="+currname+"; B="+currpwd+"; LastVisitUserName=" + currname +";");
con.setDoInput(true);
con.setDoOutput(true);
//STEP.3.发送post数据
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(con.getOutputStream()));
writer.write(postdata); writer.flush(); writer.close();
//STEP.4.获取返回数据
System.out.println("返回的代码是:"+con.getResponseCode()+"定向地址为"+con.getHeaderField("location"));
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
System.out.println(new Date());
while ((line = reader.readLine()) != null)
{ System.out.println(line); }
reader.close();
con.disconnect();
dxqrr
2012-10-06
打赏
举报
回复
socket
suwy2007
2012-10-06
打赏
举报
回复
还有别的回答吗
火龙果被占用了
2012-10-06
打赏
举报
回复
你要自己通过 Socket 来发送 HTTP 数据包?
哎,我看楼主还是不要费这个心了,简单的好弄的,但是要能应用于生产环境的,那可没有那么简单!
JDK 中有现成的 HttpURLConnection
Apache 中有现成的 HttpComponent, HttpClient 4.x
Apache Commons 中有现成的 HttpClient 3.x
有这么多现在的工具为什么不用呢?你认为你能写得比这里工具好?
suwy2007
2012-10-06
打赏
举报
回复
我这个不是跟 web server 通信。 是在两台pc上 通过TCP 来 传 http 包。
我要自己构造 http 数据包, 然后传送。
有个实验 是要在传递这些数据包的时候 进行一些其他处理, 然后在对方接收到之后 对数据进行分析。
你说的 post 和 get 是这个意思吗
JavaNet的牛肉粉丝
2012-10-06
打赏
举报
回复
你是说你创建一个类,将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程序互相发送自定义类的方法。
java
实现snmp
数据包
发送
和接收资料
java
实现snmp
数据包
发送
和接收资料,个人收集的,免费下吧。
java
UDP报文的
发送
与接收
java
UDP报文的
发送
与接收
java
UDP报文的
发送
与接收
java
UDP报文的
发送
与接收
Network-Simulation:
模拟
网络如何通过TCP协议
发送
数据包
。 使用十六进制文件
模拟
所有层,以表示
数据包
Java
代码是为
发送
和接收帧的客户端和服务器进程编写的。 这两个过程的职责包括:字节填充,错误检测和具有超时机制的PAR协议,该机制会在未及时确认帧时导致帧重新传输。客户最初,客户端进程调用物理层以与服务器...
课程设计
发送
TCP
数据包
.doc
简单地
模拟
TCP包头进行数据打包和解析的功能。 源代码是用
java
编写的,文档中包含了源代码和设计思路。请大家下载后只做参考。
Java
模拟
GBN
后退N帧ARQ协议对传统的自动重传请求(ARQ,Automatic Repeat reQues)进行了改进,从而实现了在接收到ACK之前能够连续
发送
多个
数据包
。 简易用
java
模拟
的GBN
Java SE
62,616
社区成员
307,307
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章