サーバーに接続し、接続を常に開いたままにし、サーバーから切断されたときに自動再接続するこの非同期クライアントソケットを作成しました。
とにかく私の問題はこれです:接続の初期化時に、操作を接続操作として登録します(SelectionKey.OP_Connect
)。
ここで、セレクターの選択したキー間を反復すると、制御ステートメント isconnectable に入り、制御ステートメントに示されているように操作が変更されることを期待しています。
残念ながら、選択したキーをまったく取得していません。どこで間違っている可能性がありますか?
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
/*
* @author kewin
*/
public class clientEvent implements Runnable{
private static volatile boolean connected=false;
private SocketChannel channel;
private Selector selector;
private ByteBuffer readBuffer = ByteBuffer.allocate(8192);
private QueueData Qdata;
private SelectionKey selectKey;
private void initiateConnection() {
try {
selector= Selector.open();//initializes the Selector Thread
channel = SocketChannel.open();
channel.configureBlocking(false);
channel.connect(new InetSocketAddress(InetAddress.getByName("127.0.0.1"),2000));
Thread.sleep(50);//Sleeps for a few Seconds to allow decent connection completion
channel.register(selector,SelectionKey.OP_CONNECT);//Registers the channel with the a selector and a selection key
if(channel.finishConnect())/*checks whether the connection is finished*/{
channel.register(selector,SelectionKey.OP_READ);//Registers the channel with the a selector and a selection key
connected=true;}
} catch(Exception ex){connected=false;}
}
private void ConnectAndMonitor(){
while(true){
try {
readBuffer.clear();
channel.read(readBuffer);
} catch (Exception ex) {
connected=false
try {
channel.close()
selector.close();
} catch (Exception e) {
}
if(!connected){
initiateConnection();
connected=true;
}
}
}
}
@Override
public void run() {
try{
new Thread(){@Override public void run(){ConnectAndMonitor()}}.start();
while(true){
if(!connected){
System.out.println("not connected");
Thread.sleep(500);
}
else{
selector.selectNow();
Set Keys=selector.keys();
Iterator iterator =Keys.iterator();
while(iterator.hasNext()){
SelectionKey key=(SelectionKey)iterator.next();
if(key.isConnectable()){
channel.register(selector,SelectionKey.OP_READ);
System.out.println("Connectable");
break;
}
if(key.isReadable()){
channel.register(selector,SelectionKey.OP_WRITE);
System.out.println("Readable");
break;
}
if(key.isWritable()){
channel.register(selector,SelectionKey.OP_CONNECT);
System.out.println("Writable");
break;
}
System.out.println("<<<<<<<<<>>>>>>>>>>>>");
}
Thread.sleep(1000);
}
}
}
catch(Exception ex){
}
}
public static void main(String[] args){
new Thread(new clientEvent()).start();
}
}