主机名作为带参数的URL会导致java.net.UnknownHostException

时间:2014-05-01 10:02:40

标签: java sockets networking tcp network-programming

我尝试与只有一个路径打开的主机执行套接字握手,但我一直收到以下错误:

java.net.UnknownHostException: example.com/tests/test1?id=abc

这是我的 Handshake.java 类:

import java.io.*;
import javax.net.ssl.*;

public class Handshake {

    public static void main(String[] args) {
        String host = "example.com/tests/test1?id=abc";
        int port = 443;
        SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
        try {
            SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
            printSocketInfo(socket);
            socket.startHandshake();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void printSocketInfo(SSLSocket socket) {
        System.out.println("Socket class: " + socket.getClass());
        System.out.println("Remote address = " + socket.getInetAddress().toString());
        System.out.println("Remote port = " + socket.getPort());
        System.out.println("Local socket address = " + socket.getLocalSocketAddress().toString());
        System.out.println("Local address = " + socket.getLocalAddress().toString());
        System.out.println("Local port = " + socket.getLocalPort());
        System.out.println("Need client authentication = " + socket.getNeedClientAuth());
        SSLSession ss = socket.getSession();
        System.out.println("Cipher suite = " + ss.getCipherSuite());
        System.out.println("Protocol = " + ss.getProtocol());
    }
}

2 个答案:

答案 0 :(得分:2)

  

java.net.UnknownHostException:example.com/tests/test1?id=abc

这不是SSL握手问题。这是一个主机名查找问题,它是由于您作为所谓的主机名提供的内容不属于此类这一事实。它是一个URL,包含查询。它可用作HTTP事务中的URL。对于Socket来说,它是完全没有意义的。

重申一下,它与SSL或握手无关,因为堆栈跟踪应该已经告诉过你了。

答案 1 :(得分:1)

对我来说这似乎很自我解释,因为如果无法从域名确定主机的IP地址,则抛出UnknownHostException。如果您直接放置IP(假设您的域不是example.com ...),没有路径和查询字符串会发生什么?