java - 具有安全套接字的 Java HTTPS 客户端
问题描述
我目前正在编写一个带有一些网络和反射工具的框架。
作为我的网络类的示例,我喜欢编写一个 HTTP/S 客户端。
目前,服务器正在接受客户端握手,但如果我发送 HTTP 标头,服务器不会应答。
我尝试使用一些 Javax SSL 扩展属性进行调试,但对我来说似乎没问题。
标头(在普通 HTTP 上工作):
GET /index.html HTTP/1.1 Host: www.xxx.de Connection: Keep-Alive User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT) Accept-Language: en-u
服务器正在接收请求,但 Java 部分无法识别响应...
"C:\Program Files\Java\jdk1.8.0_291\bin\java.exe" -javaagent:D:\JetBrains\apps\IDEA-U\ch-1\213.5281.15\lib\idea_rt.jar=1044:D:\JetBrains\apps\IDEA-U\ch-1\213.5281.15\bin -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_291\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\rt.jar;F:\Programmieren\MyTrioX\ProxMox\target\classes;F:\Programmieren\MyTrioX\Extra\target\classes;F:\Programmieren\MyTrioX\Slave\target\classes" de.bytestore.mytriox.proxmox.ProxMox
javax.net.ssl|FINE|01|main|2021-11-02 19:29:41.072 CET|SSLCipher.java:438|jdk.tls.keyLimits: entry = AES/GCM/NoPadding KeyUpdate 2^37. AES/GCM/NOPADDING:KEYUPDATE = 137438953472
BBB
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.543 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_AES_128_GCM_SHA256 for TLS12
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.544 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_AES_256_GCM_SHA384 for TLS12
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.550 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.550 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.550 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.550 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.551 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.551 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.551 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.551 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.551 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.551 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.551 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.552 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.552 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.552 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.552 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.552 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.552 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.552 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.553 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.553 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.553 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.553 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.553 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 for TLS11
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.554 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.554 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.554 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.554 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.554 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.555 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.555 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.555 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.555 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.555 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.555 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.556 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.556 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.556 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.556 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.556 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.557 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.557 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.557 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.557 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.557 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.558 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.558 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 for TLS10
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.559 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_AES_128_GCM_SHA256 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.559 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_AES_256_GCM_SHA384 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.559 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.559 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.559 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.559 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_GCM_SHA384 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.559 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.560 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.560 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.560 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.560 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.560 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_128_GCM_SHA256 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.560 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.560 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.561 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.561 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.561 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.561 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.561 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.561 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.561 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.561 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.562 CET|HandshakeContext.java:297|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 for SSL30
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.708 CET|SSLCipher.java:1817|KeyLimit read side: algorithm = AES/GCM/NOPADDING:KEYUPDATE
countdown value = 137438953472
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.710 CET|SSLCipher.java:1971|KeyLimit write side: algorithm = AES/GCM/NOPADDING:KEYUPDATE
countdown value = 137438953472
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.769 CET|SSLCipher.java:1817|KeyLimit read side: algorithm = AES/GCM/NOPADDING:KEYUPDATE
countdown value = 137438953472
javax.net.ssl|FINE|01|main|2021-11-02 19:29:42.773 CET|SSLCipher.java:1971|KeyLimit write side: algorithm = AES/GCM/NOPADDING:KEYUPDATE
countdown value = 137438953472
[SUCCESS]: Handshake with Server 173.212.219.135 via Method TLS_AES_256_GCM_SHA384 was correct.
[INFO]: Starting Client Socket connecting to Address 173.212.219.135 on Port 443.
[SUCCESS]: Client connected to Address www.byte-store.de/173.212.219.135 on Port 443.
WRITE
GET /index.html HTTP/1.1
Host: www.byte-store.de
Connection: Keep-Alive
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Accept-Language: en-us
ClientSocket.class:
package de.bytestore.mytriox.network.client;
public class ClientSocket {
private ArrayList<ClientInterface> listenerIO = new ArrayList<ClientInterface>();
private InetSocketAddress networkIO;
private Socket socketIO;
private int timeoutIO = 0;
private Thread threadIO;
private Timer timerIO;
// Define Secure Settings of Socket.
private boolean secureIO = false;
private CertificateUtils certificateIO = new CertificateUtils();
private boolean binaryIO = false;
private boolean stringIO = false;
// Store Client Callbacks for String as Initiator.
private HashMap<String, ClientCallback> callbacksIO = new HashMap<String, ClientCallback>();
private OutputStream outputIO = null;
public ClientSocket(InetSocketAddress networkIO) {
this.networkIO = networkIO;
}
public ClientSocket(String addressIO, int portIO) {
this.networkIO = new InetSocketAddress(addressIO, portIO);
}
public void setBinary(boolean binaryIO) {
this.binaryIO = binaryIO;
}
public void setString(boolean stringIO) {
this.stringIO = stringIO;
}
public void setSecure(boolean stateIO) {
this.secureIO = stateIO;
}
public boolean isSecure() {
return secureIO;
}
/**
* Set Timeout of Socket in Seconds.
*
* @param timeoutIO
*/
public void setTimeout(int timeoutIO) {
this.timeoutIO = timeoutIO * 1000;
}
public void connect() {
try {
if (secureIO) {
this.certificateIO = new CertificateUtils("TLS", "JKS", "12345678", new FileManager("F:\\Programmieren\\MyTrioX\\MyTrioX-CONTROLLER\\database\\keystore.jks"), new FileManager("F:\\Programmieren\\MyTrioX\\MyTrioX-CONTROLLER\\database\\store.jks"));
System.setProperty("javax.net.ssl.trustStore", "F:\\Programmieren\\MyTrioX\\MyTrioX-CONTROLLER\\configuration\\trust.store");
System.setProperty("javax.net.ssl.trustStorePassword", "12345678");
System.setProperty("javax.net.debug", "ssl # very verbose debug");
SSLSocketFactory factoryIO = (SSLSocketFactory) SSLSocketFactory.getDefault();
//this.certificateIO.getSocketFactory();
System.out.println("BBB");
// Create SecureSocket via Factory.
this.socketIO = factoryIO.createSocket(this.networkIO.getAddress(), 443);
// Print Message if Client Handshake was correct.
((SSLSocket) this.socketIO).addHandshakeCompletedListener(new HandshakeCompletedListener() {
@Override
public void handshakeCompleted(HandshakeCompletedEvent handshakeIO) {
logIO.debug(GuardianLog.Type.SUCCESS, "Handshake with Server " + socketIO.getInetAddress().getHostAddress() + " via Method " + handshakeIO.getCipherSuite() + " was correct.");
}
});
((SSLSocket) this.socketIO).setEnabledCipherSuites(((SSLSocket) this.socketIO).getSupportedCipherSuites());
((SSLSocket) this.socketIO).setEnabledProtocols(((SSLSocket) this.socketIO).getSupportedProtocols());
((SSLSocket) this.socketIO).startHandshake();
SSLParameters parametersIO = new SSLParameters();
parametersIO.setEndpointIdentificationAlgorithm("HTTPS");
((SSLSocket) this.socketIO).setSSLParameters(parametersIO);
//SSLEngine engineIO = certificateIO.getEngine();
//SSLContext contextIO = certificateIO.getContext();
//logIO.append(GuardianLog.Type.INFO, "Server " + (((SSLSocket) this.socketIO).getNeedClientAuth() ? "need" : "don't need") + " Client Authentication.");
//logIO.debug(GuardianLog.Type.INFO, "Found " + Arrays.toString(engineIO.getSupportedCipherSuites()) + " Supported Cipher Suites for Server Socket.");
if (CacheHandler.debugIO) {
//CertificateUtils.printInfo((SSLSocket) this.socketIO);
}
} else this.socketIO = new Socket(this.networkIO.getAddress(), this.networkIO.getPort());
logIO.debug(GuardianLog.Type.INFO, "Starting Client Socket connecting to Address " + this.networkIO.getAddress().getHostAddress() + " on Port " + this.networkIO.getPort() + ".");
socketIO.setTcpNoDelay(true);
socketIO.setKeepAlive(true);
socketIO.setSoTimeout(timeoutIO);
logIO.debug(GuardianLog.Type.SUCCESS, "Client connected to Address " + networkIO.getAddress() + " on Port " + networkIO.getPort() + ".");
connected(socketIO);
// Open Output Stream of Socket.
this.outputIO = socketIO.getOutputStream();
// Open Input Stream of Socket.
InputStream inputIO = socketIO.getInputStream();
this.threadIO = new Thread(new Runnable() {
@Override
public void run() {
try {
//while (!socketIO.isClosed() && readerIO.read() != -1) {
while (/**!shutdownIO &&**/socketIO.isConnected() && !socketIO.isClosed()) {
// Byte Buffer ho contains read Data.
byte[] bufferIO = new byte[inputIO.available()];
// Read Data into Buffer and store (EOF).
int codeIO = inputIO.read(bufferIO);
//if (bufferIO.length != 0 && inputIO.available() == 0) {
if (bufferIO.length != 0 && inputIO.available() == 0) {
if (binaryIO)
binary(socketIO, bufferIO);
if (stringIO)
string(socketIO, new String(bufferIO, charsetIO));
if (hasCallbacks()) {
String dataIO = new String(bufferIO);
for (String keyIO : callbacksIO.keySet()) {
if (dataIO.contains(keyIO)) {
logIO.append(GuardianLog.Type.INFO, "Executing Callback for Initiator '" + keyIO + "'.");
callbacksIO.get(keyIO).string(socketIO, dataIO);
}
}
}
}
// Sleep for 100 Milliseconds (CPU Usage)
Thread.sleep(100);
}
inputIO.reset();
inputIO.close();
if (!socketIO.isClosed()) {
socketIO.close();
}
disconnected(socketIO);
threadIO.stop();
} catch (IOException | InterruptedException errorIO) {
if (errorIO.getMessage().equalsIgnoreCase("Stream closed.") || errorIO.getMessage().equalsIgnoreCase("Connection reset")) {
logIO.debug(GuardianLog.Type.INFO, "Client was disconnected from Server with Address " + networkIO.getAddress().getHostAddress() + " on Port " + networkIO.getPort() + ".");
disconnected(socketIO);
} else logIO.append(GuardianLog.Type.ERROR, "Socket throw an Error ", errorIO);
}
}
});
this.threadIO.start();
} catch (IOException errorIO) {
logIO.append(GuardianLog.Type.ERROR, "Error by connecting to Socket on Port " + this.networkIO.getPort() + ".", errorIO);
}
}
public void disconnect() {
try {
this.outputIO.close();
if (!this.socketIO.isClosed()) {
this.socketIO.close();
}
this.threadIO.stop();
} catch (IOException e) {
e.printStackTrace();
}
}
public void connected(Socket clientIO) {
for (ClientInterface interfaceIO : listenerIO) {
interfaceIO.connected(clientIO);
}
}
public void disconnected(Socket clientIO) {
for (ClientInterface interfaceIO : listenerIO) {
interfaceIO.disconnected(clientIO);
}
}
/**
* Call ClientInterfaces with String Method.
*
* @param clientIO
* @param dataIO
*/
protected void string(Socket clientIO, String dataIO) {
for (ClientInterface interfaceIO : listenerIO) {
interfaceIO.string(clientIO, dataIO);
}
}
/**
* Call ClientInterfaces with Binary Method.
*
* @param clientIO
* @param binaryIO
*/
protected void binary(Socket clientIO, byte[] binaryIO) {
for (ClientInterface interfaceIO : this.listenerIO) {
interfaceIO.binary(clientIO, binaryIO);
}
}
public void registerListener(ClientInterface clientIO) {
this.listenerIO.add(clientIO);
}
public void unregisterListener(ClientInterface clientIO) {
this.listenerIO.remove(clientIO);
}
public void unregisterListeners() {
this.listenerIO = new ArrayList<ClientInterface>();
}
public boolean getState() {
if (this.socketIO != null) {
return (!this.socketIO.isClosed() && this.socketIO.isConnected());
}
return false;
}
public Socket getSocket() {
return socketIO;
}
public boolean hasCallbacks() {
return !(this.callbacksIO.isEmpty());
}
public boolean hasCallback(String initiatorIO) {
return this.callbacksIO.containsKey(initiatorIO);
}
public ClientCallbackInterface addCallback(String initiatorIO, ClientCallback callbackIO) {
this.callbacksIO.put(initiatorIO, callbackIO);
logIO.append(GuardianLog.Type.INFO, "Added Callback with Initiator '" + initiatorIO + "' to callbacks.");
return callbackIO;
}
public void removeCallback(String initiatorIO) {
this.callbacksIO.remove(initiatorIO);
}
protected HashMap<String, ClientCallback> getCallbacks() {
return this.callbacksIO;
}
public InetSocketAddress getNetwork() {
return this.networkIO;
}
public void setNetwork(InetSocketAddress networkIO) {
this.networkIO = networkIO;
}
public void write(String dataIO) {
this.write(dataIO.getBytes(charsetIO));
}
public void write(byte[] dataIO) {
try {
this.outputIO.write(dataIO);
} catch (IOException exceptionIO) {
logIO.append(GuardianLog.Type.ERROR, "Can't write to Server.", exceptionIO);
}
}
public void flush() {
try {
this.outputIO.flush();
} catch (IOException exceptionIO) {
logIO.append(GuardianLog.Type.ERROR, "Can't flush Output Stream from Socket.", exceptionIO);
}
}
protected OutputStream getOutputIO() {
return this.outputIO;
}
}
ProxMox.class(示例):
package de.bytestore.mytriox.proxmox;
public class ProxMox extends Module {
public static void main(String[] args) throws MalformedURLException {
WebClient clientIO = new WebClient(new URL("https://www.byte-store.de/index.html"));
// host1.byte-system.de:8006
WebHeader headerIO = clientIO.request();
System.out.println(headerIO.getBody());
}
}
WebClient.class 请看Pastebin,因为我的字符有限。
解决方案
我发现以下代码仅适用于 HTTP:
this.threadIO = new Thread(new Runnable() {
@Override
public void run() {
try {
//while (!socketIO.isClosed() && readerIO.read() != -1) {
while (socketIO.isConnected() && !socketIO.isClosed()) {
// Byte Buffer ho contains read Data.
byte[] bufferIO = new byte[inputIO.available()];
// Read Data into Buffer and store (EOF).
int codeIO = inputIO.read(bufferIO);
//if (bufferIO.length != 0 && inputIO.available() == 0) {
if (bufferIO.length != 0 && inputIO.available() == 0) {
if (binaryIO)
binary(socketIO, bufferIO);
if (stringIO)
string(socketIO, new String(bufferIO, charsetIO));
if (hasCallbacks()) {
String dataIO = new String(bufferIO);
for (String keyIO : callbacksIO.keySet()) {
if (dataIO.contains(keyIO)) {
logIO.append(GuardianLog.Type.INFO, "Executing Callback for Initiator '" + keyIO + "'.");
callbacksIO.get(keyIO).string(socketIO, dataIO);
}
}
}
}
// Sleep for 100 Milliseconds (CPU Usage)
Thread.sleep(100);
}
inputIO.reset();
inputIO.close();
if (!socketIO.isClosed()) {
socketIO.close();
}
disconnected(socketIO);
threadIO.stop();
} catch (IOException | InterruptedException errorIO) {
if (errorIO.getMessage().equalsIgnoreCase("Stream closed.") || errorIO.getMessage().equalsIgnoreCase("Connection reset")) {
logIO.debug(GuardianLog.Type.INFO, "Client was disconnected from Server with Address " + networkIO.getAddress().getHostAddress() + " on Port " + networkIO.getPort() + ".");
disconnected(socketIO);
} else logIO.append(GuardianLog.Type.ERROR, "Socket throw an Error ", errorIO);
}
}
});
但这适用于 HTTPS:
new Thread(new Runnable() {
@Override
public void run() {
try {
BufferedReader readerIO = new BufferedReader(new InputStreamReader(handshakeIO.getSocket().getInputStream()));
System.out.println("AAA");
String lineIO = null;
while ((lineIO = readerIO.readLine()) != null) {
System.out.println(readerIO.readLine());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
不知道为什么,但我认为有些东西正在挂起我的功能。
推荐阅读
- macports - 升级 macports 时如何解决请求的变体错误
- android - 如何从“onDataChange”侦听器内部将字符串添加到 ArrayList?
- docker - 如何在 Kubernetes 中将用于容器的 Docker 映像的摘要作为环境变量传递
- r - R 中的 Twitter API - Geo 的关注者数量
- php - 如何在foreach中获取当前数组键
- node.js - 如何在没有 createdAt 字段的情况下按年龄升序对 mongodb 查询结果进行排序?(新到旧)
- android - BasicNetwork.performRequest:Volley 的意外响应代码 422
- iis-7.5 - 主图标未加载到 Office Web 插件中,因为“承诺被拒绝”
- date - 如何防止 Tableau 自动转换日期格式?
- r - 在 HPC 集群中调用 ncdf4 nc_open 时 R 挂起