java - 构建从本地主机到 google.com 的套接字时出现错误

标签 java sockets network-programming

我正在java中运行套接字编程,我遇到了如下代码的问题,在我的本地主机和google.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)

最佳答案

“localhost”是一个特殊的虚拟接口(interface),将机器连接到其自身。您无法通过它启动与 google.com 的连接。如果您想要启动与 google.com 的连接,则必须通过以某种方式实际连接到互联网的界面来执行此操作。

如果将 Socket socket = new Socket("www.google.com", 80, addr, 59645); 替换为 Socket socket = new Socket("www.google.com"", 80);,您应该能够使用该目标的操作系统的默认接口(interface)打开该套接字,但随后将随机选择源端口。

如果你想控制源端口,可以这样做: Socket套接字 = new Socket("www.google.com", 80, InetAddress.getByName("0.0.0.0"), 59645);

关于java - 构建从本地主机到 google.com 的套接字时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40191613/

相关文章:

java - 使用roo用mongo创建springsource项目

python - 客户端使用 python 套接字接收两条单独的消息

qt - 如何在不使用QProcess的情况下在C++/Qt中进行ping操作?

java - 当我使用 getClass.getMethod(...) 时,它是 "reflection"吗?

java - Spring MVC : using @ResponseStatus(reason = '' ) on a @ResponseBody exception handler in tomcat

java - request.getSession().getId() 与 session.getId()

android - BluetoothServerSocket.accept() 返回未连接的 BluetoothSocket 的问题

java.net.BindException :JVM Bind

c++ - 吞吐量网络估计

c++ - Boost asio async_read_until 在匹配条件下停止阅读