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

📄 messagereader.java

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