如何实现自定义tcp报文的首部呢? 我们一般都是基于传输层进行编程,你如果希望基于网络层进行编程,建议采用c/c++来实现,java api里面可能没有。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 修改TCP报文头...这个过于底层, 平常见到的交互协议之类的都是在上层, 路过,没搞过. 我发一个我自己定义的应用层报文件头给你看看:QQ信息事件报文: QF10F0 采用16进制,如下:顺序 类型及长度 含义1 byte(1) QF (6字节开始)2 byte(1) 103 byte(1) QF4 byte(1) 105 byte(1) QF6 byte(1) 107 byte(1) 报文字节顺序(高字段在前: 1,底字节在前: 0)8 byte(1) F0 (事件类型)9 byte(1) 年(日期从2000年起计序号) 10 byte(1) 月 11 byte(1) 日12 byte(1) 时 13 byte(1) 分 14 byte(1) 秒 15 byte(1) 内容长度16 byte(N) 15中规定的字节长度的数据. 我配置好了jpcap的环境了,但是api还不是太明白。不知道怎么三次握手建立tcp连接再发送tcp报文... 嗯,查了很多资料,确实没有,但是有基于jni调用wincap的jpcap可以实现.... tcp连接 就是在java里用 Socket,三次握手,这只是一种方式,你连上后直接发也没有人管你.三次握手只是做一种比较严格的机制, 如果你定义 10次握手发送难道就不行么.只能说 3次是比较正常的处理方法. /** * @param args */ public static void main(String[] args) { try{ Socket sock = new Socket("127.0.0.1", 9002); InputStream sin = sock.getInputStream(); OutputStream out = sock.getOutputStream(); ByteArrayOutputStream buffeOut =new ByteArrayOutputStream(); List<My> list =null; long tv1 =0; long tv2 =0; int ava=0; int sum=0; String strout =""; for(int i=0; i<10000; i++){ //发送 if(list==null) list=getSendData(); sum=0; My e =null; strout =""; byte[] bb = new byte[1024]; tv1 =System.currentTimeMillis(); for(int j=0; j<50; j++){ e =list.get(j); strout =strout+e.getId()+" "+e.getDescrb()+"\r\n"; } bb =strout.getBytes("utf-8"); sum =sum + bb.length; out.write(bb); out.flush(); tv2 =System.currentTimeMillis(); System.out.println("发送: " + strout); System.out.println(i+",发送: 长度"+sum+",用时: "+(tv2-tv1)); //接收 sum=0; ava =sin.available(); byte inBuf[] = new byte[512]; int c; if(ava>0){ while ((c = sin.read(inBuf)) != -1) { buffeOut.write(inBuf, 0, c); sum =sum+c; ava =sin.available(); if(ava<=0){ Thread.sleep(100); ava =sin.available(); if(ava<=0) break; } } String strin = new String(buffeOut.toByteArray(),"utf-8"); System.out.println(i+",接收: " + strin); buffeOut.reset(); } Thread.sleep(200); } Thread.sleep(5000); sock.shutdownOutput(); out.close(); sin.close(); sock.close(); buffeOut.close(); } catch (IOException ie) { System.out.println("服务器异常"); ie.printStackTrace(); }catch (Exception ex) { System.out.println("服务器异常"); ex.printStackTrace(); } finally { System.out.println("Request,NOsssssss."); } } 一般定义一个一定格式的字符串就能满足要求如果要用类来定义,先让该头部类序列化,然后使用ObjectOutputStream把对象转为字节流发送,然后接收端再使用ObjectOutputStream把对象字节流还原成对象,然后再读取对象的属性值就行了思路就是这样~ 共享一下模仿QQ好友列表,点击表头展开对应Tab的源码 求一个从不同集合中组合数据的算法? 急问!! 单点登录后,重定向后,如何取回原来的session? 求n得阶乘的程序,哪里错了 用SWT/JFace如何获取文件图标? 新人提问,如果限制input里面输入的字符串的长短 怎么在servlet里创建一个Image对象?? 俄罗斯方块运行的问题 处学者的简单问题。创建窗体显示的问题。 用NetBeans8.0.1启动tomcat7失败 HowNet语义词典 关于 FileReader 问题
采用16进制,如下:
顺序 类型及长度 含义
1 byte(1) QF (6字节开始)
2 byte(1) 10
3 byte(1) QF
4 byte(1) 10
5 byte(1) QF
6 byte(1) 10
7 byte(1) 报文字节顺序(高字段在前: 1,底字节在前: 0)
8 byte(1) F0 (事件类型)
9 byte(1) 年(日期从2000年起计序号)
10 byte(1) 月
11 byte(1) 日
12 byte(1) 时
13 byte(1) 分
14 byte(1) 秒
15 byte(1) 内容长度
16 byte(N) 15中规定的字节长度的数据.
三次握手,这只是一种方式,你连上后直接发也没有人管你.
三次握手只是做一种比较严格的机制, 如果你定义 10次握手发送难道就不行么.
只能说 3次是比较正常的处理方法. /**
* @param args
*/
public static void main(String[] args) {
try{
Socket sock = new Socket("127.0.0.1", 9002);
InputStream sin = sock.getInputStream();
OutputStream out = sock.getOutputStream();
ByteArrayOutputStream buffeOut =new ByteArrayOutputStream();
List<My> list =null;
long tv1 =0;
long tv2 =0;
int ava=0;
int sum=0;
String strout ="";
for(int i=0; i<10000; i++){
//发送
if(list==null) list=getSendData();
sum=0;
My e =null;
strout ="";
byte[] bb = new byte[1024];
tv1 =System.currentTimeMillis();
for(int j=0; j<50; j++){
e =list.get(j);
strout =strout+e.getId()+" "+e.getDescrb()+"\r\n";
}
bb =strout.getBytes("utf-8");
sum =sum + bb.length;
out.write(bb);
out.flush();
tv2 =System.currentTimeMillis();
System.out.println("发送: " + strout);
System.out.println(i+",发送: 长度"+sum+",用时: "+(tv2-tv1));
//接收
sum=0;
ava =sin.available();
byte inBuf[] = new byte[512];
int c;
if(ava>0){
while ((c = sin.read(inBuf)) != -1) {
buffeOut.write(inBuf, 0, c);
sum =sum+c;
ava =sin.available();
if(ava<=0){
Thread.sleep(100);
ava =sin.available();
if(ava<=0) break;
}
}
String strin = new String(buffeOut.toByteArray(),"utf-8");
System.out.println(i+",接收: " + strin);
buffeOut.reset();
}
Thread.sleep(200);
}
Thread.sleep(5000);
sock.shutdownOutput();
out.close();
sin.close();
sock.close();
buffeOut.close();
} catch (IOException ie) {
System.out.println("服务器异常");
ie.printStackTrace();
}catch (Exception ex) {
System.out.println("服务器异常");
ex.printStackTrace();
} finally {
System.out.println("Request,NOsssssss.");
}
}
如果要用类来定义,先让该头部类序列化,然后使用ObjectOutputStream把对象转为字节流发送,然后接收端再使用ObjectOutputStream把对象字节流还原成对象,然后再读取对象的属性值就行了
思路就是这样~