使用eclipse(windows)在java中使用IPv6地址和端口号创建套接字
当我尝试使用IPv4地址创建套接字时,它是成功的,但当我尝试使用IPv6地址和端口号创建套接字时,它会引发异常:使用eclipse(windows)在java中使用IPv6地址和端口号创建套接字,java,sockets,ipv6,Java,Sockets,Ipv6,当我尝试使用IPv4地址创建套接字时,它是成功的,但当我尝试使用IPv6地址和端口号创建套接字时,它会引发异常: java.net.SocketException: Network is unreachable: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(Unk
java.net.SocketException: Network is unreachable: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at epcs.intf.be.SimConnectionHandler.connect(SimConnectionHandler.java:332)
at epcs.intf.be.BackEndConnection.connect(BackEndConnection.java:42)
at epcs.intf.be.ProcedureRunner.runScenario(ProcedureRunner.java:230)
at epcs.exec.Runner.SendExecTrigger(Runner.java:418)
at epcs.exec.Runner.sendCommand(Runner.java:454)
at epcs.main.ExecutionThread$TaskStartTestCaseExecution.run(ExecutionThread.java:98)
at epcs.main.ExecutionThread.run(ExecutionThread.java:29)
通常,此错误意味着远程计算机的V6地址实际上没有绑定到给定端口。例如,如果您可以通过端口80上的IPV4与web服务器通信,并不意味着它实际上将本地V6地址绑定到端口。您仍然可以ping机器,但ping实际上不会告诉您端口是否绑定 要证明您使用插座的方式是正确的,快速测试如下: 在Eclipse Windows计算机上
public static void main(String[] args) {
try
{
InetAddress address = InetAddress.getByName("::");
Socket socket = new Socket(address, 135);
// Should of connected with no exception thrown since we know this port was listening in netstat
}
catch (Throwable t) {
t.printStackTrace();
}
}
我知道上述内容对您当前的代码没有帮助,但它更旨在隔离IPV6地址和端口未绑定以及套接字连接异常有效的可能性
我做的另一个测试是,我获取了Linux机器的Inet6地址,并确保SSH正在该端口上侦听。然后,我使用了上面来自Windows eclipse的相同代码,并针对我的Linux Inet6地址和端口22执行了套接字。这也很有效。我的本地tomcat失败,因为它未设置为在Inet6上侦听。该IP地址可访问吗?服务器应用程序是否正确绑定到它?Windows计算机是否安装并启用了IPv6?我不确定这是否相关,但您是否使用java 7?我知道JDK中存在一个bug,它可能会导致windows机器上IPv6的套接字问题。我甚至可以在Linux上运行相同的代码,但引发的异常是java.net.ConnectException:java.net.PlainSocketImpl.socketConnect(本机方法)的连接被拒绝,java.net.PlainSocketImpl.doConnect(未知源代码)java.net.socksocketimpl.connectToAddress(未知源)java.net.PlainSocketImpl.connect(未知源)java.net.sockssockettimpl.connect(未知源)java.net.Socket.connect(未知源)java.net.Socket.connect(未知源)java.net.Socket.connect(未知源)epcs.intf.be.SimConnectionHandler.conect(SimConnectionHandler.java:332我可以使用相同的Ipv6地址ping系统,但在套接字创建过程中会引发异常。
public static void main(String[] args) {
try
{
InetAddress address = InetAddress.getByName("::");
Socket socket = new Socket(address, 135);
// Should of connected with no exception thrown since we know this port was listening in netstat
}
catch (Throwable t) {
t.printStackTrace();
}
}