小编Chr*_*mer的帖子

Java NIO SocketChannels:具有多个对象和高系统负载的序列化问题

我正在使用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)

java sockets serialization load nio

2
推荐指数
1
解决办法
2269
查看次数

标签 统计

java ×1

load ×1

nio ×1

serialization ×1

sockets ×1