background image

 
然而,好景不长,随着代码越来越多,逻辑越来越复杂。好好的框架居然在 Windows 上
单元测试运行开始出现异常,看着 Java 运行异常出错的函数栈,异常居然由
Selector.open()抛出,错误信息居然是 Unable to establish loopback connection。
 
“Selector.open()居然报 loopback connection 错误,凭什么?不应该啊?open 的时
候又没有什么 loopback 的 socket 连接,怎么会报这个错?”
 
长期使用 C/C++的程序当然会对操作系统的调用非常熟悉,虽然 Java 的虚拟机搞的什
么系统调用都不见了,但 C/C++的程序员必然要比 Java 程序敏感许多。
 

三、  

 

开始调查 : 怎么 Java

“ ”

这么 傻 !

 
于是,C/C++的老鸟从

SystemInternals

§上下载

Process Explorer

§来查看一下究竟

是什么个 Loopback Connection  

。 果然,打开 java 运行进程,发现有一些自己连接自

己的 localhost 的 TCP/IP 链接。于是另一个问题又出现了,
 
“凭什么啊?为什么会有自己和自己的连接?我程序里没有自己连接自己啊,怎么可能会
有这样的链接啊?而自己连接自己的端口号居然是些奇怪的端口。”
 
问题变得越来越蹊跷了。难道这都是 Selector.open()在做怪?难道 Selector.open()要
创建一个自己连接自己的链接?写个程序看看:
 

import

 java.nio.channels.Selector;

import

 java.lang.RuntimeException;

import

 java.lang.Thread;

public

 

class

 TestSelector {

    

private

 

static

 

final

 

int

 MAXSIZE=

5

;

    

public

 

static

 

final

 

void

 main( String argc[] ) {

        Selector [] sels = 

new

 Selector[ MAXSIZE];

 
            

try

{

                

for

int

 i = 

0

 ;i< MAXSIZE ;++i ) {

                    sels[i] = Selector.open();
                    

//sels[i].close();

                }
                Thread.sleep(

30000

);

            }

catch

( Exception ex ){

                

throw

 

new

 RuntimeException( ex );

            }
    }
}