サンプルの 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;
}