2016-02-28 96 views
0

我正在学习Java套接字。我试图发送一个HTTPS GET请求给Facebook,像这样:如何通过套接字发送HTTPS请求?

String request = "GET/HTTP/1.0\r\n" 
       + "Host: www.facebook.com\r\n" 
       + "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0\r\n" 
       + "Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7\r\n" 
       + "Accept-Language: de,en;q=0.7,en-us;q=0.3\r\n" 
       + "Accept-Encoding: gzip\r\n" 
       + "Connection: close\r\n\r\n"; 
byte[] Outdata = request.getBytes(); 
Socket server = new Socket("www.facebook.com", 443); 
DataOutputStream outputStream = new DataOutputStream(server.getOutputStream()); 
outputStream.write(Outdata); 
outputStream.flush(); 

然后,我尝试从服务器侦听收到的数据,这样的:

DataInputStream inputStream = 
    new DataInputStream(server.getInputStream());  
byte[] InData = new byte[1024]; 

while (true) { 
    inputStream.read(InData); 
    String data = new String(InData, StandardCharsets.UTF_8); 
    System.out.println(data); 
} 

但我不从服务器获取任何返回数据。为什么?

+4

如果你想谈论SSL/HTTPS,你可能想要一个['SSLSocket'](https://docs.oracle.com/javase/7/docs/api/javax/net/ssl/SSLSocket的.html)。 –

回答

1

两个答案。

  1. 您正试图与HTTPS服务器通话。这就要求你建立一个SSL/TLS频道。这是真的很难< <做一个普通的套接字...你必须实现连接协商,客户端验证的关键链,会话加密/解密,等等。

    更加健全的方法是使用SSLSocket,SSLSocketFactory等来处理SSL/TLS的东西...但它仍然有点棘手。

  2. 通过Socket与HTTP或HTTPS服务交谈不是明智的做法。这样做并不是真的要学到很多东西,因为如果需要更多的控制权,可以使用HttpURLConnection或Apache HTTP库来与Java的HTTP/HTTPS服务交谈。