📄 messagecreater.java
字号:
package com.stun.writer;
import java.net.DatagramPacket;
import java.net.InetSocketAddress;
import com.stun.inter.STUN;
import com.stun.inter.StunMessageCreater;
import com.stun.tool.Change;
public class MessageCreater implements StunMessageCreater{
private STUN hm;
private byte[] message;
private Change tool;
public MessageCreater() {
}
/**
* 得到一个默认的STUN请求信息
*
* @return
*/
public DatagramPacket getDefaultRequestHeaderMessage(STUN hm) {
instance(hm);
try {
int mtype = STUN.BINDINGREQUEST;
int length = 0;// STUN消息长度默认为0
byte messagetype[] = tool.integerToTwoBytes(mtype);// STUN头type
System.arraycopy(messagetype, 0, message, 0, 2);
byte messagelength[] = tool.integerToTwoBytes(length);
System.arraycopy(messagelength, 0, message, 2, 2);
byte[] tranID = tool.generateTransactionID();
System.arraycopy(tranID, 0, message, 4, 16);
hm.setMessageType(mtype);
hm.setMessagelength(length);
hm.setTransactionID(tranID);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return new DatagramPacket(message, message.length);
}
/**
* 得到一个改变回复的STUN请求信息
*
* @param sa
* @param type
* @return
*/
public DatagramPacket getChangeRequestHeadMessage(STUN hm,InetSocketAddress sa,
byte[] type) {
instance(hm);
try {
int mtype = STUN.BINDINGREQUEST;
int index = 20;
int length = 20;// STUN消息长度为20
byte messagetype[] = tool.integerToTwoBytes(mtype);
System.arraycopy(messagetype, 0, message, 0, 2);
byte messagelength[] = tool.integerToTwoBytes(length);
System.arraycopy(messagelength, 0, message, 2, 2);
byte[] tranID = tool.generateTransactionID();
System.arraycopy(tranID, 0, message, 4, 16);
hm.setMessageType(mtype);
hm.setMessagelength(length);
hm.setTransactionID(tranID);
int atype = STUN.RESPONSEADDRESS;
setAddress(sa, atype, index);
index += 12;
atype = STUN.CHANGEREQUEST;
System.arraycopy(tool.integerToTwoBytes(atype), 0, message, index,
2);
System.arraycopy(tool.integerToTwoBytes(4), 0, message, index + 2,
2);
System.arraycopy(type, 0, message, index + 4, 4);
} catch (Exception e) {
// TODO: handle exception
}
return new DatagramPacket(message, message.length);
}
/**
* 初始化
* @param hm
*/
private void instance(STUN hm) {
this.hm = hm;
this.message = hm.getMessage();
this.tool = hm.getTool();
}
/**
* 设置地址属性
* @param sa
* @param mtype
* @param index
* @throws Exception
*/
public void setAddress(InetSocketAddress sa, int atype, int index)
throws Exception {
System.arraycopy(tool.integerToTwoBytes(atype), 0, message, index,
2);
System.arraycopy(tool.integerToTwoBytes(8), 0, message, index + 2,
2);
System.arraycopy(new byte[] { tool.integerToOneByte(hm
.getResponseAddressFamily()) }, 0, message, index + 5, 1);
System.arraycopy(tool.integerToTwoBytes(sa.getPort()), 0, message,
index + 6, 2);
System.arraycopy(sa.getAddress().getAddress(), 0, message,
index + 8, 4);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -