AddressedEnvelope
AddressedEnvelope<M, A>
表示一個帶有發送者和接收者地址的消息封裝,常用于處理如 UDP 數據報這類含地址信息的通信場景。
public interface AddressedEnvelope<M, A extends SocketAddress> {// 實際的消息內容M content();// 消息的發送方地址A sender();// 消息的接收方地址A recipient();
}
DefaultAddressedEnvelope
DefaultAddressedEnvelope
是一個通用的消息封裝類,包含消息本體與可選的發送者和接收者地址。
public class DefaultAddressedEnvelope<M, A extends SocketAddress> implements AddressedEnvelope<M, A> {private final M message;private final A sender;private final A recipient;public DefaultAddressedEnvelope(M message, A recipient, A sender) {requireNonNull(message, "message");if (recipient == null && sender == null) {throw new NullPointerException("recipient and sender");}this.message = message;this.sender = sender;this.recipient = recipient;}public DefaultAddressedEnvelope(M message, A recipient) {this(message, recipient, null);}@Overridepublic M content() {return message;}@Overridepublic A sender() {return sender;}@Overridepublic A recipient() {return recipient;}@Overridepublic String toString() {if (sender != null) {return StringUtil.simpleClassName(this) +'(' + sender + " => " + recipient + ", " + message + ')';} else {return StringUtil.simpleClassName(this) +"(=> " + recipient + ", " + message + ')';}}
}
BufferAddressedEnvelope
BufferAddressedEnvelope
是一個封裝了 Buffer 消息并攜帶地址信息的可關閉資源,支持通過 replace 方法替換內容并保留地址信息。
DefaultBufferAddressedEnvelope
是通用的緩沖區+地址封裝類,DatagramPacket
是其針對UDP數據包的具體實現。
public abstract class BufferAddressedEnvelope<A extends SocketAddress, T extends BufferAddressedEnvelope<A, T>> extends DefaultAddressedEnvelope<Buffer, A> implements Resource<T> {protected BufferAddressedEnvelope(Buffer message, A recipient, A sender) {super(message, recipient, sender);}protected BufferAddressedEnvelope(Buffer message, A recipient) {super(message, recipient);}@Overridepublic Send<T> send() {Send<Buffer> contentSend = content().send();@SuppressWarnings("unchecked")Class<T> type = (Class<T>) getClass();Supplier<T> supplier = () -> replace(contentSend.receive());return Send.sending(type, supplier);}public abstract T replace(Buffer content);@Overridepublic void close() {content().close();}@Overridepublic boolean isAccessible() {return content().isAccessible();}
}
DefaultBufferAddressedEnvelope
DefaultBufferAddressedEnvelope
是將 Buffer 數據與收發地址封裝在一起的具體實現,支持內容替換與資源標記操作。
public class DefaultBufferAddressedEnvelope<A extends SocketAddress> extends BufferAddressedEnvelope<A, DefaultBufferAddressedEnvelope<A>> {public DefaultBufferAddressedEnvelope(Buffer message, A recipient, A sender) {super(message, recipient, sender);}public DefaultBufferAddressedEnvelope(Buffer message, A recipient) {super(message, recipient);}@Overridepublic DefaultBufferAddressedEnvelope<A> replace(Buffer content) {return new DefaultBufferAddressedEnvelope<>(content, recipient(), sender());}@Overridepublic DefaultBufferAddressedEnvelope<A> touch(Object hint) {content().touch(hint);return this;}
}
DatagramPacket
DatagramPacket 是基于 BufferAddressedEnvelope 的具體實現,用于封裝 UDP 數據包內容及其發送和接收地址,支持內容替換與資源跟蹤操作。
public class DatagramPacket extends BufferAddressedEnvelope<SocketAddress, DatagramPacket> {public DatagramPacket(Buffer message, SocketAddress recipient, SocketAddress sender) {super(message, recipient, sender);}public DatagramPacket(Buffer message, SocketAddress recipient) {super(message, recipient);}@Overridepublic DatagramPacket replace(Buffer content) {return new DatagramPacket(content, recipient(), sender());}@Overridepublic DatagramPacket touch(Object hint) {super.touch(hint);return this;}
}