📄 messagereader.java
字号:
package com.stun.reader;
import java.net.DatagramPacket;
import com.stun.inter.STUN;
import com.stun.inter.StunMessageReader;
import com.stun.tool.Change;
public class MessageReader implements StunMessageReader{
private Change tool;
private byte[] message;
/**
* 属性头长度
*/
private final int ATTRIBUTEHEADERLENGTH = 4;
/**
* 解读头信息
*
* @param dp
* @param tranID
*/
public STUN getHeaderMessage(DatagramPacket dp, byte[] tranID) {
STUN stunBean=new STUN();
this.tool =stunBean.getTool();
this.message = stunBean.getMessage();
try {
message = dp.getData();//消息内容
byte[] retranID = new byte[16];// 回复来的STUN信息ID
System.arraycopy(message, 4, retranID, 0, 16);
stunBean.setTransactionID(retranID);
byte[] messagetype = new byte[2];// 定义数组长度为2
System.arraycopy(message, 0, messagetype, 0, 2);
switch (tool.twoBytesToInteger(messagetype)) {
case (STUN.BINDINGREQUEST):
System.out.println("receive a STUN request");
stunBean.setMessageType(STUN.BINDINGREQUEST);
// 解读请求
break;
case (STUN.BINDINGRESPONSE):
System.out.println("receive a STUN response");
// 开始解读回复
stunBean.setMessageType(STUN.BINDINGRESPONSE);
break;
case (STUN.BINDINGERRORRESPONSE):
stunBean.setMessageType(STUN.BINDINGERRORRESPONSE);
System.out.println("error!!");
// 开始解读
break;
default:
System.out.println("error response message !!");
break;
}
if(tranID!=null)
this.checkTranID(tranID, retranID);
this.readAttribute(stunBean, message, tool);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return stunBean;
}
/**
* 解读属性
*
* @param stunBean
* @param message
* @param change
*/
public void readAttribute(STUN stunBean, byte[] message, Change change) {
try {
byte[] messagelength = new byte[2];// 定义数组长度为2
System.arraycopy(message, 2, messagelength, 0, 2);// 把数组message的2,3位复制给messagelength
stunBean.setMessagelength(change.twoBytesToInteger(messagelength));
if (stunBean.getMessagelength() > 0) {// 判断有没有消息长度
byte[] attributeType = new byte[2];// 属性类型
byte[] attributeLength = new byte[2];// 属性长度
int index = ATTRIBUTEHEADERLENGTH;
while (true) {// 循环解读所有的属性
if (index >= (change.twoBytesToInteger(messagelength))) {// 如果到消息末尾
break;
}
System.arraycopy(message, index + 16, attributeType, 0, 2);// 解读出消息的类型
System
.arraycopy(message, index + 18, attributeLength, 0,
2);// 解读出消息的长度
byte[] port = new byte[2];
byte[] address = new byte[4];
switch (change.twoBytesToInteger(attributeType)) {// 判断消息的类型
case (STUN.MAPPEDADDRESS):// MAPPEDADDRESS
change.getAddress(message, index, port, address);
stunBean.setMappedAddressPort(change.twoBytesToInteger(port));
stunBean.setMappedAddressAddress(change
.getStringIPValue(address));
System.out.println("MAPPEDADDRESS:"
+ stunBean.getMappedAddressAddress());
break;
case (STUN.RESPONSEADDRESS):// RESPONSEADDRESS
change.getAddress(message, index, port, address);
stunBean.setResponseAddressPort(change
.twoBytesToInteger(port));
stunBean.setResponseAddressAddress(change
.getStringIPValue(address));
System.out.println("RESPONSEADDRESS:"
+ stunBean.getResponseAddressAddress());
break;
case (STUN.CHANGEREQUEST):// CHANGEREQUEST
byte changeRequestByte[] = new byte[4];
System.arraycopy(message, index + 20,
changeRequestByte, 0, 4);
stunBean.setChangeRequest((int) change
.fourBytesToLong(changeRequestByte));
break;
case (STUN.SOURCEADDRESS):// SOURCEADDRESS
change.getAddress(message, index, port, address);
stunBean.setSourceAddressPort(change.twoBytesToInteger(port));
stunBean.setSourceAddressAddress(change
.getStringIPValue(address));
System.out.println("SOURCEADDRESS:"
+ stunBean.getSourceAddressAddress());
break;
case (STUN.CHANGEDADDRESS):// CHANGEDADDRESS
change.getAddress(message, index, port, address);
stunBean
.setChangedAddressPort(change
.twoBytesToInteger(port));
stunBean.setChangedAddressAddress(change
.getStringIPValue(address));
System.out.println("CHANGEADDRESS:"
+ stunBean.getChangedAddressAddress());
break;
case (STUN.USERNAME):// USERNAME
break;
case (STUN.PASSWORD):// PASSWORD
break;
case (STUN.MESSAGEINTEGRITY):// MESSAGEINTEGRITY
break;
case (STUN.ERRORCODE)://ERRORCODE
System.out.println("receive a ERROR response !!\n\t begin read");
byte[] errorNum=new byte[2];
System.arraycopy(message, index+2, errorNum, 0,2);
byte[] errorReason=new byte[change.twoBytesToInteger(messagelength)-4];
System.arraycopy(message, index+4, errorReason, 0, errorReason.length);
stunBean.setErrorCodeNumber(change.twoBytesToInteger(errorNum));
stunBean.setErrorCodeReasonPhrase(new String(errorReason).trim());
System.out.println(stunBean.getErrorCodeNumber()+":"+stunBean.getErrorCodeReasonPhrase());
System.out.println("end read");
break;
default:
System.out.println("错误的属性");
stunBean.setErrorCodeNumber(1);
break;
}
index = index + change.twoBytesToInteger(attributeLength)
+ ATTRIBUTEHEADERLENGTH;
}
}
} catch (Exception e) {
// TODO: handle exception
}
}
/**
* 判断STUNID是不是相等,看是不是正确的消息
*
* @param tranID
* @param retranID
* @return
*/
public boolean checkTranID(byte[] tranID, byte[] retranID) {
if (tranID[0] == retranID[0] && tranID[1] == retranID[1]
&& tranID[2] == retranID[2] && tranID[3] == retranID[3]
&& tranID[4] == retranID[4] && tranID[5] == retranID[5]
&& tranID[6] == retranID[6] && tranID[7] == retranID[7]
&& tranID[8] == retranID[8] && tranID[9] == retranID[9]
&& tranID[10] == retranID[10] && tranID[11] == retranID[11]
&& tranID[12] == retranID[12] && tranID[13] == retranID[13]
&& tranID[14] == retranID[14] && tranID[15] == retranID[15]) {
System.out.println("receive a current response!!");
return true;
} else {
System.out.println("receive a error response!!");
return false;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -