Ответы пользователя по тегу Java
  • Начинаю программировать на Java, что не так в данной программе?

    StFaustoff
    @StFaustoff
    jDev
    Все дело в том, что для JVM нужна точка старта(как и во всех других случаях в программировании), в Java это класс с методом main. В вашем классе нет ошибок, но и нет места с которого должна начаться работа. Посмотрите внимательнее урок, возможно есть другой класс, который содержит данный метод.
    Ответ написан
    Комментировать
  • Как сделать SSL socket клиент серверное приложение?

    StFaustoff
    @StFaustoff
    jDev
    Работа с сертификатами бывает разная. Это может быть как просто использование сертификата на стороне сервера и дальнейшая проверка через центры сертификации, так и использование самоподписанных сертификатов, когда и клиент и сервер имеют один сертификат и обмениваются ими при подключении. Первый вариант проще, второй бесплатный.
    После этого нужно настроить веб контейнер. Вот тут есть хороший пример настройки TomCat'a. Собственно я использую двухфазную самоподписанную сертификацию.
    После этого начнется "жара" =) Так как я пользуюсь самоподписанным сертификатом, то задача немного усложняется. Дело в том, что на стороне мобильного клиента необходима предварительная настройка контекста интернет соединения для работы с сертификатом. Соответственно идут клиент обращается серверам сертификации, чтобы проверить надежность ресурса. Но так как все самопальное, то приходиться настройки безопасности переводить в режим - доверять всему.
    После этой настройки, контекст передается для создаваемого коннекта и регистрируется.
    Приведу пример кода, выстраданного многими часами кропотливой работы
    try{// Работа с SSL пробрасывает исключения, порой очень неприятные и непонятно как устранимые
       KeyStore keyStore = KeyStore.getInstance("Your_Type_Of_Certificate");//делаем хранилище ключей, аналогичное типу Вашего сертификата
       InputStream in = ...// крепим к потоку сам файл сертификата
       try{
          keyStore.load(in, "Your_Password".toCharArray());//грузим в хранилище сертификат, дополняя его паролем от сертификата
       }catch (Exception ex){
          Log.wtf("OMG",ex.getLocalizedMessage());//либо файла нет, либо пароль не тот
       }finally {
          in.close();
       }
       // Один из "столпов" клиентского SSL, отвечает за хранение всех сертификатов. Имеются разные варианты его настройки(разные алгоритмы)
       KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
       kmf.init(keyStore, "Your_Password".toCharArray());
       KeyManager[] keyManagers = kmf.getKeyManagers();
    
       //Второй элемент, который "должен" проверять, валидны ли наши сертификаты
       TrustManager[] wrappedTrustManagers = new TrustManager[]{
           new X509TrustManager() {
               public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                  return null;
                }
                public void checkClientTrusted(X509Certificate[] certs, String authType) { }
                public void checkServerTrusted(X509Certificate[] certs, String authType) {}
            }
       };
       SSLContext sslContext = SSLContext.getInstance("TLSv1");//Создаем контекст SSL по типу протокола
       sslContext.init(keyManagers, wrappedTrustManagers,  new java.security.SecureRandom());//инициализируем его
           return sslContext;// Радуемся =)
       }catch (Exception ex){
            Log.wtf("OMG", ex.getLocalizedMessage());// Печалимся ='(
            return null;
       }


    После этого контекст можно использовать при создании соединений
    //Устанавливаем контекст
       HttpsURLConnection.setDefaultSSLSocketFactory(методНаписанныйВыше().getSocketFactory());
        //Та самая "защита" которая говорит "мне плевать на всех, коннекчусь куда хочу". Виной этому самоподписанный сертификат.
       HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
       
       SchemeRegistry registry = new SchemeRegistry();
    
        SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
        socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
        registry.register(new Scheme("Type_Of_Connection", socketFactory, 443));
    
        SingleClientConnManager mgr = new SingleClientConnManager(yourConnection.getParams(), registry);
        //Я работаю по https, по этому пример для него
        DefaultHttpClient httpClient = new DefaultHttpClient(mgr, yourConnection.getParams());
    
        HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);


    За такой код я бы и сам себя убил, но увы, любые попытки его поправить к успеху не привели, я рукожоп)
    Стоит заметить, что я использую библиотеки org.apache.http и другие deprecate вещи. Вам же я желаю сделать все по уму и красоте. Надеюсь помог)
    Если будут вопросы, обращайтесь.
    Ответ написан
    4 комментария
  • Как вызвать Toast с другого класса?

    StFaustoff
    @StFaustoff
    jDev
    Ка дополнительный вариант ко всем предыдущим ответам, можно попробовать MyClass.this.

    PS
    Только я не пойму такой мудреной системы инстанцировать Activity в другом Activity.
    Мы создадим Activity в другом Activity чтобы ты мог использовать Activity пока работает Activity =)

    757-tachka-na-prokachku-ostalos-tolko-pr
    Ответ написан
    Комментировать