0

サーバーに接続するアプリがあります。セキュア ソケット SSLSocket で接続します。Lollipop 以下の Android では、getInputStream の呼び出しは問題なく通過し、残りの部分は機能しますが、電話を Marshmallow にアップグレードすると、同じ API 呼び出しが機能しなくなります。例外が返され、「getInputStream failed 10」という出力が表示されます。タイムアウトを増やしてみました。InitSsl() はすでに一度呼び出されています。

助けてください。

前もって感謝します。

public class PeerData {

    static public String Ip;

    static public InetAddress inetAddr;

    static SSLSocket SocTcpCtrl = null;
    static SSLSocketFactory sf = null;
    static TrustManager tm[] = { new PubKeyManager() };
    static SSLContext context = null;

    static InetSocketAddress socketAddress;
    static InputStream inStream;
    static OutputStream outStream;
    static Socket plainSoc = null;


    PeerData() {
        InitSsl();

        Data = new byte[128];
        PeerData.inetAddr = null;
    }

    @SuppressLint("TrulyRandom")
    static void InitSsl() {

        if( context == null ) {

            try {
                context = SSLContext.getInstance("TLSv1");  // TLSv1.2  TLSv1.1 TLSv1   TLS SSL     SSLv3
                DebugUtils.LOGD("SSL", String.format("Got context"));
            } catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            try {
                //context.init(new KeyManager[] { km }, tm, new SecureRandom());
                context.init(null, tm, new SecureRandom());
                DebugUtils.LOGD("SSL", String.format("Context init"));
            } catch (KeyManagementException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            sf = context.getSocketFactory();
        }
    }

    void CreateAndConnect(InetAddress inetAddr) {

        int timeout = 10;
        int port = 1212;

        if( SocTcpCtrl != null ) {
            return;
        }

        this.inetAddr = inetAddr;

        Ip = inetAddr.getHostAddress().toString();

        DebugUtils.LOGD(TAG, String.format("Connecting to %s", Ip));

        SocketAddress sockAddr = new InetSocketAddress(Ip, port);

        plainSoc = new Socket();

        try {
            plainSoc.connect(sockAddr, timeout * 1000);
        } catch (IOException e2) {
            DebugUtils.LOGE(TAG, String.format("Failed connect"));
            SocTcpCtrl = null;
            return;
        }


        try {
            SocTcpCtrl = (SSLSocket) sf.createSocket(plainSoc, Ip, port, true);
        } catch (IOException e1) {

            try {
                plainSoc.close();
            } catch (IOException e) {
            }
            SocTcpCtrl = null;
            return;
        }


        try {
            SocTcpCtrl.setSoTimeout(timeout * 1000);
        } catch (SocketException e) {
            DebugUtils.LOGE(TAG, String.format("setSoTimeout failed0"));
            try {
                SocTcpCtrl.close();
            } catch (IOException e1) {
            }
            try {
                plainSoc.close();
                DebugUtils.LOGE(TAG, String.format("setSoTimeout failed2"));
            } catch (IOException e1) {
            }
            SocTcpCtrl = null;
            DebugUtils.LOGE(TAG, String.format("setSoTimeout failed3"));
            return;
        }

        try {
            inStream = SocTcpCtrl.getInputStream(); /////////   Throws exception on Marshmallow!!!! On Lollipop and below, it is fine.
        } catch (IOException e) {
            DebugUtils.LOGE(TAG, String.format("getInputStream failed %d", timeout));
            try {
                SocTcpCtrl.close();
            } catch (IOException e1) {
            }
            try {
                plainSoc.close();
            } catch (IOException e1) {
            }
            SocTcpCtrl = null;

            return;
        }

        try {
            outStream = SocTcpCtrl.getOutputStream();
        } catch (IOException e) {
            DebugUtils.LOGE(TAG, String.format("getInputStream failed %d", timeout));
            try {
                SocTcpCtrl.close();
            } catch (IOException e2) {
            }
            try {
                plainSoc.close();
            } catch (IOException e1) {
            }
            SocTcpCtrl = null;
            DebugUtils.LOGE(TAG, String.format("outStream failed"));
            return;
        }
    }
}
4

0 に答える 0