有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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)

共 (2) 个答案

  1. # 1 楼答案

    从网络的角度来看,你试图构建的东西没有意义

    远程主机名和端口正常。问题是,作为源地址提供的IP地址是环回地址。意思是“这个主人”。无法从机器外部将其路由到。(或者更准确地说,如果“google.com”主机确实向“127.0.0.1”发送了一个数据包,那么它就是在自言自语!)

    您需要提供与将从主机发送数据包的NIC相对应的IP地址。一个简单的方法是改变这一点:

        String x = Inet4Address.getLoopbackAddress().getHostAddress().toString();
        InetAddress addr = InetAddress.getByName(x);
    

    为此:

        InetAddress addr = InetAddress.getLocalHost();
    

    更简单的是,在创建套接字时不要指定源地址和端口。让操作系统来解决


    如果确实需要,可以使用NetworkInterface类(javadoc)枚举系统中所有已配置的网络接口,并尝试根据绑定的IP地址的属性选择合适的接口。然而,要可靠地做到这一点,您需要了解网络拓扑/路由,我认为没有办法获得这些信息。如果出于某种原因,getLocalHost调用返回了错误的IP地址,那么通过属性、命令行参数或类似的方式配置正确的IP地址会更简单

  2. # 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);