Skip to content

Commit

Permalink
调整编解码方法
Browse files Browse the repository at this point in the history
  • Loading branch information
ZhenLII committed Nov 24, 2022
1 parent 1ce6395 commit adfb51c
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 48 deletions.
38 changes: 28 additions & 10 deletions src/main/java/classicstun/message/Message.java
Original file line number Diff line number Diff line change
@@ -1,39 +1,57 @@
package classicstun.message;

import classicstun.message.attributes.MessageAttribute;
import classicstun.message.enums.MessageHeaderType;
import classicstun.message.exception.MessageExcepion;

import java.awt.*;
import java.util.List;

/**
* @author JiangZhenli
*/
public class Message {
MessageHeader header;
List<MessageAttribute> messageAttributes;
private MessageHeader header;
private List<MessageAttribute> messageAttributes;
private byte[] bytes;

public Message(MessageHeader header, List<MessageAttribute> messageAttributes) {

public Message(MessageHeader header, List<MessageAttribute> messageAttributes) throws MessageExcepion {
this.header = header;
this.messageAttributes = messageAttributes;
bytes = encode();
}

public MessageHeader getHeader() {
return header;
}

public void setHeader(MessageHeader header) {
this.header = header;
}

public List<MessageAttribute> getMessageAttributes() {
return messageAttributes;
}

public void setMessageAttributes(List<MessageAttribute> messageAttributes) {
this.messageAttributes = messageAttributes;


public byte[] encode() throws MessageExcepion {
int length = 0;
byte[] dataBytes = new byte[length];
for(MessageAttribute attribute : messageAttributes) {
byte[] attributeData = attribute.encode();
length += attributeData.length;
byte[] newData = new byte[length];
System.arraycopy(dataBytes,0,newData,0,dataBytes.length);
System.arraycopy(attributeData,0,newData,dataBytes.length - 1 ,attributeData.length);
dataBytes = newData;
}
header.setMessageLength(length);
byte[] headerBytes = header.encode();
byte[] messageBytes = new byte[headerBytes.length + dataBytes.length];
System.arraycopy(headerBytes,0, messageBytes,0,headerBytes.length);
System.arraycopy(dataBytes,0, messageBytes,headerBytes.length - 1, dataBytes.length);
return messageBytes;
}

static Message parse(byte[] data) throws MessageExcepion {
public static Message parse(byte[] data) throws MessageExcepion {
MessageHeader header = MessageHeader.decode(data);
int length = header.getMessageLength();
if(length != data.length - 20) {
Expand Down
81 changes: 43 additions & 38 deletions src/main/java/classicstun/message/MessageHeader.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import classicstun.message.enums.MessageHeaderType;
import classicstun.message.exception.MessageHeaderExcepion;
import common.exception.ByteUiltsException;
import common.utils.ByteUtils;

import java.util.UUID;
Expand All @@ -26,18 +25,21 @@
* 参见 RFC3489
* @author JiangZhenli
*/
class MessageHeader {
public class MessageHeader {
private MessageHeaderType messageType;
private int messageLength;
private String tansactionId;
private byte[] transactionId;

private MessageHeader() {
}

private MessageHeader(MessageHeaderType messageType, int messageLength, String tansactionId) {
private MessageHeader(MessageHeaderType messageType, int messageLength, byte[] transactionId) {
if(transactionId.length != 16) {
throw new IllegalArgumentException("The length of transactionId must be 16 (byte).");
}
this.messageType = messageType;
this.messageLength = messageLength;
this.tansactionId = tansactionId;
this.transactionId = transactionId;
}

void setMessageLength(int messageLength) throws MessageHeaderExcepion {
Expand All @@ -51,17 +53,7 @@ void setMessageType(MessageHeaderType messageHeaderType) {
this.messageType = messageHeaderType;
}

public MessageHeaderType getMessageType() {
return messageType;
}

public int getMessageLength() {
return messageLength;
}

public String getTansactionId() {
return tansactionId;
}

byte[] encode() throws MessageHeaderExcepion {
byte[] messageHeaderCode = new byte[20];
Expand All @@ -72,24 +64,8 @@ byte[] encode() throws MessageHeaderExcepion {
byte[] messageLengthCode = ByteUtils.intToByteArray(messageLength);
messageHeaderCode[2] = messageLengthCode[2];
messageHeaderCode[3] = messageLengthCode[3];

byte[] tansactionIdbytes;
try {
tansactionIdbytes = ByteUtils.uuidToByteArray(tansactionId);
System.arraycopy(tansactionIdbytes, 0, messageHeaderCode, 4, tansactionIdbytes.length);
return messageHeaderCode;
} catch (ByteUiltsException e) {
throw new MessageHeaderExcepion("Encode MessageHeader Failed");
}
}


// 初始化一个用于发送的MessageHeader
static MessageHeader init(MessageHeaderType messageHeaderType) {
MessageHeader header = new MessageHeader();
header.messageType = messageHeaderType;
header.tansactionId = UUID.randomUUID().toString().replaceAll("-", "");
return header;
System.arraycopy(transactionId, 0, messageHeaderCode, 4, transactionId.length);
return messageHeaderCode;
}

static MessageHeader decode(byte[] bytes) throws MessageHeaderExcepion {
Expand All @@ -101,15 +77,13 @@ static MessageHeader decode(byte[] bytes) throws MessageHeaderExcepion {
byte[] messageTransactionIdBytes = new byte[16];
int messageType;
int messageLength;
String transactionId;

try {
System.arraycopy(bytes, 0, messageTypeBytes, 0, 2);
System.arraycopy(bytes, 2, messageLengthBytes, 0, 2);
System.arraycopy(bytes, 4, messageTypeBytes, 0, 16);
System.arraycopy(bytes, 4, messageTransactionIdBytes, 0, 16);
messageType = ByteUtils.twoBytesToInteger(messageTypeBytes);
messageLength = ByteUtils.twoBytesToInteger(messageLengthBytes);
transactionId = ByteUtils.byteArrayToUUIDString(messageTransactionIdBytes);

} catch (Exception e) {
throw new MessageHeaderExcepion("Decode MessageHeader Failed");
}
Expand All @@ -121,6 +95,37 @@ static MessageHeader decode(byte[] bytes) throws MessageHeaderExcepion {
throw new MessageHeaderExcepion("Invalid Message Length");
}

return new MessageHeader(type, messageLength, transactionId);
return new MessageHeader(type, messageLength, messageTransactionIdBytes);
}

public MessageHeaderType getMessageType() {
return messageType;
}

public int getMessageLength() {
return messageLength;
}

public byte[] getTransactionId() {
return transactionId;
}

// 初始化一个用于发送的MessageHeader
public static MessageHeader init(MessageHeaderType messageHeaderType, byte[] transactionId, boolean genTransactionId) {
MessageHeader header = new MessageHeader();
header.messageType = messageHeaderType;
if(transactionId != null ) {
if( transactionId.length != 16) {
throw new IllegalArgumentException("The length of transactionId must be 16 (byte).");
}
header.transactionId = transactionId;
} else if(genTransactionId) {
header.transactionId = ByteUtils.uuidToByteArray(UUID.randomUUID());
}

return header;
}



}

0 comments on commit adfb51c

Please sign in to comment.