⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 replysetter.java

📁 基于java的stun服务器和客户端 实现了关于stun防火墙探测
💻 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 + -