2009-07-02 151 views
1

我想写一个简单的程序来打开一个套接字通道到本地地址。我得到一个连接被拒绝异常,每当我运行这个程序java.net.ConnectException:当SocketChannel.open被调用时连接被拒绝

import java.net.InetAddress; 
import java.net.InetSocketAddress; 
import java.nio.channels.SocketChannel; 

public class testSocket { 

     public static void main(String [] args) { 
       try { 
         InetAddress addr = InetAddress.getByName("localhost"); 
         InetSocketAddress remoteAddress = new InetSocketAddress(addr, 19015); 

         // Open a new Socket channel and set it to non-blocking 
         SocketChannel socketChannel = SocketChannel.open(); 
         socketChannel.configureBlocking(false); 

         // Issue the Connect call on the remote address. 
         socketChannel.connect(remoteAddress); 
       } catch (Exception e) { 
         e.printStackTrace(); 
       } 
     } 
} 

,我得到的是

java.net.ConnectException: Connection refused 
     at sun.nio.ch.Net.connect(Native Method) 
     at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:464) 
     at testSocket.main(testSocket.java:17) 

我遇到与Sun Solaris和HP这个问题的例外 - UX。它似乎在Linux机器上正常工作。任何人都可以让我知道为什么连接被拒绝?我做了一个netstat -a并确认该端口未被使用。

在此先感谢!

回答

0

从()的Javadoc SocketChannel.connect

如果此信道是在非阻塞模式,则此方法的调用发起非阻塞连接操作。如果立即建立连接(就像本地连接可能发生的那样),则此方法返回true。否则,此方法返回false,并且以后必须通过调用finishConnect方法完成连接操作。

当我在Linux上运行你的代码时,connect()返回false,因此没有例外。如果您将调用添加到socketChannel.finishConnect(),您将看到与Solaris/HP-UX上的相同的连接拒绝异常。

我怀疑在Solaris/HP-UX上connect()返回true,因此立即抛出异常。

1

“连接被拒绝”消息是您在指定端口上没有进程侦听时会收到的消息(19015年)。它看起来像你试图连接到一个不存在的服务。 netstat甚至告诉你,该端口没有被使用!

相关问题