简体   繁体   English

带有安全套接字的 Java HTTPS 客户端

[英]Java HTTPS Client wit Secure Socket

I am currently writing a Framework with some Network and reflection utils.我目前正在编写一个带有一些网络和反射实用程序的框架。

As an example for my Network Class, I like to write an HTTP/S Client.作为我的网络类的示例,我喜欢编写一个 HTTP/S 客户端。

Currently, the Server is accepting the Client Handshake, but if I send an HTTP Header the Server don't answer.目前,服务器正在接受客户端握手,但如果我发送 HTTP 标头,服务器不会应答。

I tried to Debug with some Javax SSL Extension Properties, but it seems okay for me.我尝试使用一些 Javax SSL 扩展属性进行调试,但对我来说似乎没问题。

Headers (Working on normal HTTP):标头(在普通 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

The Server is receiving the Request, but the Java Part didn't recognise the Response...服务器正在接收请求,但 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: 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 (Example): 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 Plese look Pastebin, because i am limited in Chars. WebClient.class 请看 Pastebin,因为我的字符数有限。

Pastebin Link粘贴链接

I found out that following Code only works for HTTP:我发现以下代码仅适用于 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);
                }
            }
        });

But this works for HTTPS:但这适用于 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();

Don't know why, but i think something is hanging my functions.不知道为什么,但我认为有些东西挂了我的功能。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM