想实现模拟发送http数据包, 我的理解是这样: 用class 来构造http数据包的头部和 body。
body的部分我是想讲一个文件按照byte 输入。 然后来发送。问题是: OutputStream.write() 处理的是byte。 我如何将我构造的http数据包的类对象 变成 byte, 然后给write 写入buffer中? 是要将每个变量 挨个加起来吗? 还是有其他的办法? 如果能给个类似的例子 就更好了。
谢谢
body的部分我是想讲一个文件按照byte 输入。 然后来发送。问题是: OutputStream.write() 处理的是byte。 我如何将我构造的http数据包的类对象 变成 byte, 然后给write 写入buffer中? 是要将每个变量 挨个加起来吗? 还是有其他的办法? 如果能给个类似的例子 就更好了。
谢谢
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();
我说的不是这个意思。 我说的是自己构造http数据包后 如何通过 TCP socket发送出去。
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");
}
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数据包的发送与接受,不用解包,只要收到就行。
ByteArrayOutputStream bao=new ByteArrayOutputStream();
ObjectOutputStream oop=new ObjectOutputStream(bao);
oop.writeObject(myClass);//这里把自定义类注入进去
ByteBuffer bba=ByteBuffer.wrap(bao.toByteArray());
这个bba就是类序列化后的字节,然后socket的send发送给对方,然后接收方可以再使用ObjectInPutStream再解析成自定义类。
那上面这种一般是TCP协议的socket程序互相发送自定义类的方法。
Apache 中有现成的 HttpComponent, HttpClient 4.x
Apache Commons 中有现成的 HttpClient 3.x有这么多现在的工具为什么不用呢?你认为你能写得比这里工具好?