代码很简单:import java.nio.channels.Selector;
import java.nio.channels.spi.AbstractSelector;public class test
{
    public test(){
    }    public static void main( String argc[] ){
        for( int i = 0 ; i < 90000 ;i++ ){
            try{
            Selector sel = Selector.open();            sel.close();            }catch( Exception e ){
                e.printStackTrace();
                return;
            }
            System.out.println( "i:"+i );
        }
    }
}
jdk1.5
jdk1.6 均测试过
在Windows下报异常:
java.io.IOException: Unable to establish loopback connection
        at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:106)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.nio.ch.PipeImpl.<init>(PipeImpl.java:122)
        at sun.nio.ch.SelectorProviderImpl.openPipe(SelectorProviderImpl.java:2
)
        at java.nio.channels.Pipe.open(Pipe.java:133)
        at sun.nio.ch.WindowsSelectorImpl.<init>(WindowsSelectorImpl.java:105)
        at sun.nio.ch.WindowsSelectorProvider.openSelector(WindowsSelectorProvi
er.java:26)
        at java.nio.channels.Selector.open(Selector.java:209)
        at test.main(test.java:11)
Caused by: java.io.IOException: 您的主机中的软件放弃了一个已建立的连接。
        at sun.nio.ch.SocketDispatcher.write0(Native Method)
        at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:33)
        at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:104)
        at sun.nio.ch.IOUtil.write(IOUtil.java:75)
        at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:334)
        at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:83)
        ... 8 more同时发现有很多自己连接的tcp连接,通过操作系统管理命令netstat -an可以看见
  TCP    127.0.0.1:1919         127.0.0.1:1920         TIME_WAIT
  TCP    127.0.0.1:1921         127.0.0.1:1922         TIME_WAIT
  TCP    127.0.0.1:1923         127.0.0.1:1924         TIME_WAIT
  TCP    127.0.0.1:1927         127.0.0.1:1928         TIME_WAIT
  TCP    127.0.0.1:1929         127.0.0.1:1930         TIME_WAIT
  TCP    127.0.0.1:1931         127.0.0.1:1932         TIME_WAIT
  TCP    127.0.0.1:1935         127.0.0.1:1936         TIME_WAIT
  TCP    127.0.0.1:1939         127.0.0.1:1940         TIME_WAIT
  TCP    127.0.0.1:1941         127.0.0.1:1942         TIME_WAIT
  TCP    127.0.0.1:1949         127.0.0.1:1950         TIME_WAIT
  TCP    127.0.0.1:1951         127.0.0.1:1952         TIME_WAIT
  TCP    127.0.0.1:1959         127.0.0.1:1960         TIME_WAIT
  TCP    127.0.0.1:1961         127.0.0.1:1962         TIME_WAIT
  TCP    127.0.0.1:1963         127.0.0.1:1964         TIME_WAIT
  TCP    127.0.0.1:1969         127.0.0.1:1970         TIME_WAIT
  TCP    127.0.0.1:1977         127.0.0.1:1978         TIME_WAIT
  TCP    127.0.0.1:1979         127.0.0.1:1980         TIME_WAIT
  TCP    127.0.0.1:1985         127.0.0.1:1986         TIME_WAIT
  TCP    127.0.0.1:1993         127.0.0.1:1994         TIME_WAIT
  TCP    127.0.0.1:2001         127.0.0.1:2002         TIME_WAIT
  TCP    127.0.0.1:2005         127.0.0.1:2006         TIME_WAIT
  TCP    127.0.0.1:2009         127.0.0.1:2010         TIME_WAIT
  TCP    127.0.0.1:2011         127.0.0.1:2012         TIME_WAIT
  TCP    127.0.0.1:2047         127.0.0.1:2048         TIME_WAIT在linux下这段程序执行正常。难道这就是所谓java 跨平台????

解决方案 »

  1.   

    没有能回答吗?我真的要藐视一下java了。我一直写C++程序,select函数对于多路复用相当简单,我不知道java的selector会什么设计的那么复杂,CanceledKey,SelectedKey,Key三个集合都不能直接操作,用起来相当别扭,除非每次分配新的的Selector,但是分配新的Selector又会报错,JAVA你还要我怎么做?这是BUG吗?
      

  2.   

    那你就接着用你的C++好了! C++比Java强,何必倒退呢!
      

  3.   

    因为在windows下nio需要与自己建立的TCP连接,用于wakeup()函数。
    同理,在linux下则是需要与自己建立的管道。
    发生“java.io.IOException: Unable to establish loopback connection”,可能是你的防火墙挡住了。请确认系统能够自由的建立TCP联接。