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

📄 messagecreater.java

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