按照网上的教程,写了一个NIO的例子,但是客户端在执行到一部分的时候,没有获得结果。代码如下:
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.channels.Selector;
import java.nio.channels.SelectionKey;
import java.nio.channels.SelectableChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;import java.net.InetAddress;
import java.net.Socket;
import java.net.ServerSocket;
import java.net.InetSocketAddress;
import java.util.*;
import java.util.Date;
import java.util.Iterator;public class MyServer {
SocketChannel sc; ServerSocketChannel ssc; Selector selector; private static Charset charset = Charset.forName("US-ASCII"); private static CharsetEncoder encoder = charset.newEncoder(); private static CharsetDecoder decoder = charset.newDecoder(); ByteBuffer br = ByteBuffer.allocate(1024); MyServer() {
try {
InetSocketAddress addr = new InetSocketAddress(InetAddress
.getLocalHost(), 26); ssc = ServerSocketChannel.open();
ssc.configureBlocking(false);
ServerSocket ss = ssc.socket();
ss.bind(addr);
System.out.println("asdf");
selector = Selector.open();
ssc.register(selector, SelectionKey.OP_ACCEPT); while (true) {
if (selector.select() > 0) {
System.out.println("asdf");
Set readyKeys = selector.selectedKeys();
Iterator it = readyKeys.iterator();
while (it.hasNext()) {
SelectionKey sk = (SelectionKey) it.next();
it.remove();
if (sk.isAcceptable()) {
sc = ssc.accept();
sc.read(br);
br.flip();
CharBuffer cb = decoder.decode(br);
System.out.print(" : " + cb);
sc.configureBlocking(false);
sk=sc.register(selector,0);
sk.interestOps(SelectionKey.OP_READ);
selector.wakeup();
}
if(sk.isReadable()){
sc.read(br);
br.flip();
CharBuffer cb = decoder.decode(br);
System.out.print("is readable  : " + cb);
sk.interestOps(SelectionKey.OP_WRITE);
selector.wakeup();
}
if(sk.isWritable()){
 String now = new Date().toString();
                 sc.write(encoder.encode(CharBuffer.wrap("write"+now +"\r\n")));
System.out.println(sc.socket().getInetAddress() +" : " + now);
sk.interestOps(SelectionKey.OP_READ);
elector.wakeup();
 
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
sc.close();
ssc.close(); } catch (Exception e) {
}
} } public static void main(String args[]) {
new MyServer();
}
}import java.nio.channels.SocketChannel;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.Selector;
import java.nio.channels.SelectionKey;
import java.util.*;
import java.util.Date;
import java.nio.charset.*;
import java.io.IOException;public class MyClient {
SocketChannel sc; Selector selector; private final int MAX_LENGTH = 1024; // private static Charset charset = Charset.forName("US-ASCII"); private static Charset charset = Charset.forName("US-ASCII"); private static CharsetDecoder decoder = charset.newDecoder(); private static CharsetEncoder encoder = charset.newEncoder(); private ByteBuffer r_buff = ByteBuffer.allocate(MAX_LENGTH); public MyClient() {
try {
InetSocketAddress addr = new InetSocketAddress(InetAddress
.getLocalHost(), 26); sc = SocketChannel.open();
            sc.configureBlocking(false);
            sc.connect(addr);
if(sc.isConnectionPending()){
sc.finishConnect();
}
selector=Selector.open();
    sc.register(selector,SelectionKey.OP_CONNECT);
System.out.println("register(selector, SelectionKey.OP_CONNECT");
while (true) {
int n=selector.select(30);
System.out.println("elector.select(30)="+n);
if (n> 0) {
Set set = selector.selectedKeys();
Iterator it = set.iterator();
if (it.hasNext()) {
System.out.println("it.hasNext()");
SelectionKey sk = (SelectionKey) it.next();
it.remove();
if (sk.isConnectable()) {
System.out.println("4");
r_buff.clear();
String now = new Date().toString();
sc.write(encoder.encode(CharBuffer.wrap(now+ "\r\n")));
                                   sc.register(selector,SelectionKey.OP_READ);
}
}
}
}
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {
sc.close();
} catch (IOException ioe) {
System.err.println("finally sth. is wrong with br.readline() ");
}
}
} public static void main(String args[]) {
new MyClient();
}
}客户端在执行到:  System.out.println("register(selector, SelectionKey.OP_CONNECT");  就停止了,不知道为什么啊。

解决方案 »

  1.   

    应该是System.out.println("elector.select(30)="+n);  中打印的全是0。客户端得结果是:
    register(selector, SelectionKey.OP_CONNECT
    elector.select(30)=0
    elector.select(30)=0
    elector.select(30)=0
    elector.select(30)=0
    elector.select(30)=0
    elector.select(30)=0
    elector.select(30)=0
    elector.select(30)=0
    elector.select(30)=0
    elector.select(30)=0
    elector.select(30)=0
    elector.select(30)=0
    elector.select(30)=0
    elector.select(30)=0
    elector.select(30)=0
    。。
      

  2.   

    问题解决,原来是在客户端的:if(sc.isConnectionPending()){
    sc.finishConnect();
    }
    将connect事件截获了,去掉之后就能正确运行了。