- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用类似于 telnet 的 java 套接字类编写一个简单的 Web 客户端。我希望用户能够在任何端口上与任何 Web 服务器自由通信。我还希望有一些对 HTTP/HTTPS 通信的内置支持。我让 HTTP 部分工作得很好,但我在使用 HTTPS 时遇到了很多麻烦。
我想使用 Java 的 SSLSocket 类。我查看了很多网站和示例,并将以下代码放在一起来检索 Google 的主页。
package httpssandbox;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.cert.Certificate;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLPeerUnverifiedException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
public class HttpsSandbox {
static int port = 443;
static String addressString = "google.com";
static InetAddress address;
SSLSocket socket;
PrintWriter out;
BufferedReader in;
public static void main(String[] args) {
System.out.println("Connecting to: " + addressString);
System.out.println("Using port: " + port);
//Connect to the website
HttpsSandbox hs = new HttpsSandbox();
hs.connect();
}
public void connect(){
try {
//Resolve IP address
address = InetAddress.getByName(addressString);
System.out.println("IP address: " + address.getHostAddress());
//Connect using a secure SSL conenction
SSLSocketFactory socketf = HttpsURLConnection.getDefaultSSLSocketFactory();
socket = (SSLSocket) socketf.createSocket("google.com", port);
socket.startHandshake();
printSocketInfo();
//Get the input and output streams of the socket
out = new PrintWriter(socket.getOutputStream());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
sendHTTPGET();
System.out.println(receive());
} catch (UnknownHostException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
private void sendHTTPGET(){
//Construct a string with the message
out.println("GET / HTTP/1.1");
out.println();
out.flush();
}
private String receive(){
String message = "";
//Wait for a message to arrive.
//Wouldn't want to miss any messages delayed by network connection
try {
while(!in.ready()) {}
while(in.ready()){
message += in.readLine() + "\n";
}
return(message);
} catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
private void printSocketInfo(){
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());
System.out.println();
Certificate[] serverCerts = null;
try {
serverCerts = socket.getSession().getPeerCertificates();
} catch (SSLPeerUnverifiedException ex) {
ex.printStackTrace();
}
System.out.println("Retreived Server's Certificate Chain");
System.out.println(serverCerts.length + "Certifcates Found\n\n\n");
for (int i = 0; i < serverCerts.length; i++) {
Certificate myCert = serverCerts[i];
System.out.println("====Certificate:" + (i+1) + "====");
System.out.println("-Public Key-\n" + myCert.getPublicKey());
System.out.println("-Certificate Type-\n " + myCert.getType());
System.out.println();
}
}
}
当我运行代码时,我收到以下输出:
Connecting to: google.com
Using port: 443
IP address: 173.194.46.101
Socket class: class sun.security.ssl.SSLSocketImpl
Remote address = google.com/173.194.46.101
Remote port = 443
Local socket address = /192.168.15.126:50357
Local address = /192.168.15.126
Local port = 50357
Need client authentication = false
Cipher suite = TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
Protocol = TLSv1
Retreived Server's Certificate Chain
3Certifcates Found
====Certificate:1====
-Public Key-
Sun EC public key, 256 bits
public x coord: 92211319072714844469959217656780286932148107234802524635747648609523069275349
public y coord: 36581585054743121309038603897530740476813606346857238295887416801699179162876
parameters: secp256r1 [NIST P-256, X9.62 prime256v1] (1.2.840.10045.3.1.7)
-Certificate Type-
X.509
====Certificate:2====
-Public Key-
Sun RSA public key, 2048 bits
modulus: 19713895149719550196537065661910573762693934593220985668782860735427060889140793885919063737778303548724916253252606564904177491762533295616984617709378739783748100146882543612565825906799282133510087546060971220666055151463898734279731009956582933624646298029265838127046200538496591314458940937082185029845612274584845875286257057247598474925565775989866310636633768255501748172403430876460228793912189332026189491067186811703150477068536877439284697584041860237489395099402658887745588613142391209024263265842301844868193180477031165936332420984796347731387363914950895491332976177715889375379088870580457661428329
public exponent: 65537
-Certificate Type-
X.509
====Certificate:3====
-Public Key-
Sun RSA public key, 2048 bits
modulus: 27620593608073140957439440929253438012688864718977347268272053725994928948867769687165112265058896553974818505070806430256424431940072485024407486246475597522063246121214348496326377341879755851197260401080498544606788760407243324127929930612201002157618691487713632251700065187865963692723720912135393438861302779432180613616167225206519123176430362410262429702404863434904116727055203524505580952824336979641923534005571504410997292144760317953739063178352809680844232935574095508445145910310675421726257114605895831426222686272114090063230017292595425393719031924942422176213538487957041730136782988405751614792953
public exponent: 65537
-Certificate Type-
X.509
Sending message:
GET / HTTP/1.1
Host: google.com
此时,代码在等待服务器响应时卡住。这种回应永远不会到来。我在不同的网站上尝试了类似的代码和类似的 HTTP 请求,它发回了一个 400 错误,我目前并不担心。我现在的目标是连接到 Google 并从服务器获得响应。我不明白的是为什么我没有从服务器得到任何响应。
感谢您的帮助!我到处寻找解决方案,但没有成功。
更新:
我尝试了 user3586195 发布的代码,效果很好!诀窍在于 receive() 方法。我需要从流中读取以表明我已准备就绪。感谢大家的帮助!
最佳答案
我不认为它正在改变 bufferedwriter 但以下工作。技巧是从连接中读取一些东西。除非您阅读它,否则它永远不会发出准备就绪的信号。
package httpssandbox;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.cert.Certificate;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLPeerUnverifiedException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
public class HttpsSandbox {
static int port = 443;
static String addressString = "www.google.com";
static InetAddress address;
SSLSocket socket;
PrintWriter out;
BufferedReader in;
public static void main(String[] args) {
System.out.println("Connecting to: " + addressString);
System.out.println("Using port: " + port);
//Connect to the website
HttpsSandbox hs = new HttpsSandbox();
hs.connect();
}
public void connect() {
try {
//Resolve IP address
address = InetAddress.getByName(addressString);
System.out.println("IP address: " + address.getHostAddress());
//Connect using a secure SSL conenction
SSLSocketFactory socketf = HttpsURLConnection.getDefaultSSLSocketFactory();
socket = (SSLSocket) socketf.createSocket(addressString, port);
printSocketInfo();
socket.setSoTimeout(10000);
// socket.startHandshake();
//Get the input and output streams of the socket
out = new PrintWriter(socket.getOutputStream());
sendHTTPGET();
System.out.println(receive());
} catch (UnknownHostException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
private void sendHTTPGET() {
//Construct a string with the message
out.println("GET / HTTP/1.1");
out.println();
out.flush();
System.out.println("Sending GET / HTTP/1.1");
}
private String receive() {
String message = "";
//Wait for a message to arrive.
//Wouldn't want to miss any messages delayed by network connection
try {
System.out.println("Waiting for message");
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (!in.ready()) {
message += in.readLine() + "\n\r";
}
while (in.ready()) {
message += in.readLine() + "\n\r";
}
return (message);
} catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
private void printSocketInfo() {
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());
System.out.println();
Certificate[] serverCerts = null;
try {
serverCerts = socket.getSession().getPeerCertificates();
} catch (SSLPeerUnverifiedException ex) {
ex.printStackTrace();
}
System.out.println("Retreived Server's Certificate Chain");
System.out.println(serverCerts.length + "Certifcates Found\n\n\n");
for (int i = 0; i < serverCerts.length; i++) {
Certificate myCert = serverCerts[i];
System.out.println("====Certificate:" + (i + 1) + "====");
System.out.println("-Public Key-\n" + myCert.getPublicKey());
System.out.println("-Certificate Type-\n " + myCert.getType());
System.out.println();
}
}
关于java - 使用 java sslSocket 与 Google 通信时未收到响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29778233/
我正在尝试检查 Entry 中是否存在重复项,并使用内联消息提醒用户该数字存在。 $(document).ready(function(){ $("#con1").blur(function(
我有一个基于类的 View 。我在引导模式上使用 Ajax。为了避免页面刷新,我想使用此类基于 View 返回 JSON 响应而不是 HTTP 响应,但我只看到了如何为基于函数的 View 返回 JS
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我有一个大型内部企业基于 Web 的应用程序在 IIS6 上运行 ASP.NET 3.5,生成 401 个“未经授权”响应,然后是 200 个“Ok”响应(如 Fiddler 所述)。我知道为什么会发
感谢您研究我的问题。 我有一个node/express服务器,配置了一个server.js文件,它调用urls.js,而urls.js又调用 Controller 来处理http请求,所有这些都配置相
当我使用以下命令时,我得到正确的 JSON 响应: $ curl --data "regno=&dob=&mobile=" https://vitacademics-rel.herokuapp.co
我有一个非常简单的 RESTful 服务,它通过 POST 接收一些表单数据,其目的是在云存储(Amazon S3、Azure Blob 存储等)中简单地保留文本主体(具有唯一 ID)作为一个文件..
UDP 不发送任何 ack,但它会发送任何响应吗? 我已经设置了客户端服务器UDP程序。如果我让客户端向不存在的服务器发送数据,那么客户端会收到任何响应吗? 我的假设是; 客户端 --> 广播服务器地
我有一个电梯项目,其中 有一个扩展 RestHelper 的类,看起来像这样 serve{ "api" / "mystuff" prefix { case a
我们正在寻求覆盖 Kong 错误响应结构并编写自定义消息(即用我们的自定义消息替换“超出 API 速率限制”、“无效的身份验证凭据”等)。 我们要找的错误响应结构(代码是自定义的内部错误代码,与HTT
我正在尝试监听 EKEventStoreChangedNotification 以检查当我的应用程序处于后台时日历是否已更改。 我在 View Controller 的 initWithNibMeth
我了解 javascript,并且正在学习 ASP.NET C# 我想要做什么(完成的是javascript): document.getElementById('divID-1'
是否可以过滤所有 har 对象并仅获取 POST 请求/响应?也许在初始化 BrowserMobProxyServer 期间是这样做的方法?我需要将 har 对象保存到文件中并上传到 har 查看器。
我正在尝试向 Oauth 的 API 发送响应。遗憾的是,Symfony2 文档在解释 $response->headers->set(...); 的所有不同部分方面做得很差。 这是我的 OauthC
我正在尝试测试用例来模拟 api 调用,并使用 python 响应来模拟 api 调用。 下面是我的模拟, with responses.RequestsMock() as rsps: url
在尝试在 Haskell 中进行一些领域驱动设计时,我发现自己遇到了这个问题: data FetchAccessories = FetchAccessories data AccessoriesRes
我正在与 ANT+ USB 棒连接,并用项目 react 器替换我自己天真的“MessageBus”,因为它看起来非常合适。 USB接口(interface)本质上是异步的(单独的输入/输出管道),我
我正在将项目迁移到AFNetworking 2.0。使用AFNetworking 1.0时,我编写了代码来记录控制台中的每个请求/响应。这是代码: -(AFHTTPRequestOperation *
我有以下代码段。 ajaxRequest.onreadystatechange = function(){ if(ajaxRequest.readyState == 4){
我有问题......我在 php 中有一个监听器脚本可以执行以下操作: if ($count != 1) {echo 'no';} else { echo "yes";} 因此它会回显"is"或“
我是一名优秀的程序员,十分优秀!