0

サンプルの p2p ネットワークを作成するために Java NIO を使用していますが、問題が発生しています。

これがシナリオです

1 つのノードにクライアント機能とサーバー機能の両方があります。サーバー機能にはNIOを使用し、クライアントには通常のソケットチャネルを使用します

ノードごとに 2 つの別々のスレッドで NIO サーバー機能とクライアント機能を実行します。NIO サーバーは ServerSocketChannel とセレクターを使用します

NIO クライアントは SocketChannel を作成し、接続したいノードの ServerSocketChannel に接続します。

私の質問は次のとおりです。現在、送信者と受信者は別々のポートを使用しています。それらをマージして、送信と受信の両方に1つだけを使用するにはどうすればよいですか?

これは受信機用のコードです

 public Receiver(short port) {
    try {
        ServerSocketChannel serverSocketChannel = ServerSocketChannel
                .open();
        serverSocketChannel.socket().setReuseAddress(true);
        serverSocketChannel.configureBlocking(false);
        serverSocketChannel.socket().bind(new InetSocketAddress(port));
        this.channel = serverSocketChannel;

        Selector selector = Selector.open();
        channel.configureBlocking(false);
        channel.register(selector, SelectionKey.OP_ACCEPT);

        p2pProtocol = new Protocol(port);
        while (true) {
            int readyChannels = selector.select();
            if (readyChannels == 0) {
                // Accept channel is busy
                continue;
            }

            Set<SelectionKey> selectedKeys = selector.selectedKeys();

            Iterator<SelectionKey> keyIterator = selectedKeys.iterator();

            while (keyIterator.hasNext()) {

                SelectionKey key = keyIterator.next();

                if (key.isAcceptable()) {
                    // a connection request from other node
                    acceptKey(selector, key);
                } else if (key.isConnectable()) {
                    // a connection was established with a remote server.
                    Log.writeLog("Connectable");

                } else if (key.isReadable()) {
                    // a channel is ready for reading
                    receive(key);

                } else if (key.isWritable()) {
                    // a channel is ready for writing
                    write(key);
                }

                keyIterator.remove();
            }
        }

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

そして、これは送信者用です:

public Sender(InetAddress address, short remotePort, short serverPort) {
    this.listeningPort = serverPort;

    // Create socket connection
    try {
        socket = new Socket(address, remotePort);
        out = new DataOutputStream(socket.getOutputStream());
        in = new DataInputStream(new BufferedInputStream(
                socket.getInputStream()));
        active = true;
    } catch (IOException e) {
        e.printStackTrace();
        Log.writeLog("No I/O");
    }
}

public boolean getStatus()
{
    return active;
}

public Message sendMessage(MsgType type) {
    Message m = MessageFactory.craftRequestMessage(type,
            listeningPort, false);

    try {
        byte[] send = Conversion.serializeMessageToBytes(m).array();
        out.flush();
        out.write(send);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        Log.writeLog(e.getMessage());
    }

    return m;
}
4

0 に答える 0