📄 replysetter.java
字号:
package com.stun.writer;
import java.net.DatagramPacket;
import java.net.InetAddress;
import com.stun.inter.STUN;
import com.stun.inter.StunReplyMessageSetter;
import com.stun.tool.Change;
public class ReplySetter implements StunReplyMessageSetter {
private STUN hm;
private byte[] message;
private Change tool;
/**
* 转发状态
*/
private final int CHANGEADDRESS = 4;
/**
* 改变端口状态
*/
private final int CHANGEPORT = 2;
/**
* 改变地址和端口
*/
private final int CHANGEADDRESSANDPORT = 6;
/**
* 设置回复包
*
* @param dp
*/
public void setResponseDatagramPacket(DatagramPacket dp, STUN hm) {
this.hm = hm;
this.message = hm.getMessage();
this.tool = hm.getTool();
try {
if (hm.getTransactionID() == null || hm.getMessageType() == 0) {
System.out.println("receive a error packet! stop response!!");
return;
}
if (hm.getResponseAddressAddress() != null
&& !("".equals(hm.getResponseAddressAddress()))
&& (hm.getChangeRequest() == CHANGEADDRESS || hm
.getChangeRequest() == CHANGEADDRESSANDPORT)) {
System.out.println("change address !!!");
this.setRequest(dp);
dp.setPort(hm.getResponseAddressPort());// 设置转发的端口
dp.setAddress(InetAddress.getByName(hm
.getResponseAddressAddress()));// 设置转发的地址
dp.setData(message);// 设置转发的数据
return;
} else if (hm.getResponseAddressAddress() != null
&& !("".equals(hm.getResponseAddressAddress()))
&& hm.getChangeRequest() == CHANGEPORT) {
System.out.println("change port!!!");
}
if (hm.getMessageType() == STUN.BINDINGREQUEST) {
this.setResponse(dp);
} else {
System.out.println("error!!!");
}
dp.setData(message);// 设置回复数据
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/**
* 转发消息设置
*
* @param dp
*/
public void setRequest(DatagramPacket dp) {
try {
int type = STUN.BINDINGREQUEST;
int length = 20;
int index = 20;
hm.setMessageType(type);
hm.setMessagelength(length);// 保存消息长度:20
byte messagetype[] = tool.integerToTwoBytes(type);// STUN头type
System.arraycopy(messagetype, 0, message, 0, 2);
byte messagelength[] = tool.integerToTwoBytes(length);// STUN消息长度为20
System.arraycopy(messagelength, 0, message, 2, 2);
byte[] tranID = hm.getTransactionID();// STUN的ID
System.arraycopy(tranID, 0, message, 4, 16);
int attributetype = STUN.RESPONSEADDRESS;
setAddress(dp, index, attributetype);
index += 12;
attributetype = STUN.CHANGEREQUEST;
System.arraycopy(tool.integerToTwoBytes(attributetype), 0, message,
index, 2);
System.arraycopy(tool.integerToTwoBytes(4), 0, message, index + 2,
2);// toolREQUEST长度:4
System.arraycopy(tool.integerToFourBytes(CHANGEADDRESS), 0,
message, index + 4, 4);// 改变地址发送
} catch (Exception e) {
// TODO: handle exception
}
}
/**
* 回复消息设置
*
* @param dp
*/
public void setResponse(DatagramPacket dp) {
try {
int type = STUN.BINDINGRESPONSE;
int length = 36;// 这个回复消息的消息体长度为36
int index = 20;
System.arraycopy(tool.integerToTwoBytes(type), 0, message, 0, 2);
System.arraycopy(tool.integerToTwoBytes(length), 0, message, 2, 2);
System.arraycopy(hm.getTransactionID(), 0, message, 4, 16);
int attributetype = STUN.MAPPEDADDRESS;
setAddress(dp, index, attributetype);
attributetype = STUN.SOURCEADDRESS;
index += 12;
setAddress(dp, index, attributetype);
index += 12;
attributetype = STUN.CHANGEDADDRESS;
setAddress(dp, index, attributetype);
} catch (Exception e) {
// TODO: handle exception
}
}
/**
* 设置地址
*
* @param dp
* @param index
* @param attributetype
* @throws Exception
*/
public void setAddress(DatagramPacket dp, int index, int attributetype)
throws Exception {
System.arraycopy(tool.integerToTwoBytes(attributetype), 0, message,
index, 2);
System.arraycopy(tool.integerToTwoBytes(8), 0, message, index + 2, 2);// 地址消息的长度为8
System.arraycopy(new byte[] { tool.integerToOneByte(hm
.getMappedAddressFamily()) }, 0, message, index + 5, 1);
System.arraycopy(tool.integerToTwoBytes(dp.getPort()), 0, message,
index + 6, 2);
System
.arraycopy(dp.getAddress().getAddress(), 0, message, index + 8,
4);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -