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;}
}