java在将socket从Localhost构建到google时出错。通用域名格式
我正在用java运行一个socket编程,在这里我面临如下代码的问题,以便在我的本地主机和谷歌之间建立socket连接。com,但出现以下错误。我不确定代码中出了什么问题
If I am using LocalHost address as
String x = Inet4Address.getLocalHost().getHostAddress().toString();
then its running fine.
//code
public class SocketConnection {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SocketConnection tl= new SocketConnection();
tl.connect();
}
public void connect()
{
try {
String x = Inet4Address.getLoopbackAddress().getHostAddress().toString();
InetAddress addr = InetAddress.getByName(x);
System.out.println(addr);
Socket socket = new Socket("www.google.com", 80, addr , 59645);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
错误消息是
/127.0.0.1
java.net.NoRouteToHostException: Can't assign requested address
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at java.net.Socket.connect(Socket.java:538)
at java.net.Socket.<init>(Socket.java:434)
at java.net.Socket.<init>(Socket.java:286)
at SocketConnection.connect(SocketConnection.java:36)
at SocketConnection.main(SocketConnection.java:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
# 1 楼答案
从网络的角度来看,你试图构建的东西没有意义
远程主机名和端口正常。问题是,作为源地址提供的IP地址是环回地址。意思是“这个主人”。无法从机器外部将其路由到。(或者更准确地说,如果“google.com”主机确实向“127.0.0.1”发送了一个数据包,那么它就是在自言自语!)
您需要提供与将从主机发送数据包的NIC相对应的IP地址。一个简单的方法是改变这一点:
为此:
更简单的是,在创建套接字时不要指定源地址和端口。让操作系统来解决
如果确实需要,可以使用
NetworkInterface
类(javadoc)枚举系统中所有已配置的网络接口,并尝试根据绑定的IP地址的属性选择合适的接口。然而,要可靠地做到这一点,您需要了解网络拓扑/路由,我认为没有办法获得这些信息。如果出于某种原因,getLocalHost
调用返回了错误的IP地址,那么通过属性、命令行参数或类似的方式配置正确的IP地址会更简单# 2 楼答案
“localhost”是一个特殊的虚拟接口,它只将机器连接到自身。您不能通过它启动到
google.com
的连接。如果你想启动到google.com
的连接,你必须从一个实际上以某种方式连接到互联网的接口开始如果将
Socket socket = new Socket("www.google.com", 80, addr, 59645);
替换为Socket socket = new Socket("www.google.com", 80);
,则应该能够使用操作系统的默认接口打开该目标的套接字,但随后将随机选择源端口如果要控制源端口,可以执行以下操作:
Socket socket = new Socket("www.google.com", 80, InetAddress.getByName("0.0.0.0"), 59645);