使用的Socket和ServerSocket,这个是已经封装好了的tcp协议,只有设置目标ip地址和目标端口的API。
如果我想自己填充TCP报文首部的其他地方,应该用什么接口呢,网上搜了很多,有说在linux下的,也有说用C实现,不过讲的都不是很详细,有大神给个思路呗?
------解决思路----------------------
我们一般都是基于传输层进行编程,你如果希望基于网络层进行编程,建议采用c/c++来实现,java api里面可能没有。
------解决思路----------------------
我发一个我自己定义的应用层报文件头给你看看:
QQ信息事件报文: QF10F0
采用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中规定的字节长度的数据.
------解决思路----------------------
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.");
}
}