我正在使用java.nio中的SocketChannels在p2p网络中的几个对等体之间发送对象.每个对等体都有一个ServerSocketChannel,其他对等体可以连接到该对等体.我通过这些SocketChannel发送序列化对象.我的代码基础基本上是来自http://rox-xmlrpc.sourceforge.net/niotut/的NIO教程
我发送的所有消息都实现了相同的接口,因此我可以在接收端进行反序列化.以下代码执行此操作(使用字节计数器更新,请参见下文):
private void readKey(SelectionKey key) throws IOException {
SocketChannel channel = (SocketChannel) key.channel();
ByteBuffer readBuffer = ByteBuffer.allocate(4);
channel.read(readBuffer);
readBuffer.rewind();
int numBytes = readBuffer.getInt();
readBuffer = ByteBuffer.allocate(numBytes);
int read = channel.read(readBuffer);
Message msg = Message.deserialize(readBuffer);
this.overlay.addIncomingMessage(msg);
}
Run Code Online (Sandbox Code Playgroud)
通过对象的序列化完成发送,将消息序列化并添加到队列中,更改通道的兴趣操作,并发送序列化对象.
private void writeKey(SelectionKey key) throws IOException {
SocketChannel socketChannel = (SocketChannel) key.channel();
synchronized (this.pendingData) {
List<ByteBuffer> queue = (List<ByteBuffer>) this.pendingData.get(socketChannel);
// Write until there's not more data ...
while (!queue.isEmpty()) {
ByteBuffer buf = (ByteBuffer) queue.get(0);
// UPDATE for message …Run Code Online (Sandbox Code Playgroud)