Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > соединение по https


Автор: casper200 4.12.2006, 19:05
hi all

помогите пожалуйста разобраться.... Вот код 
Код
import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;

//public class HelloNet extends MIDlet {
public class HelloNet extends MIDlet implements 
  CommandListener {

    // User interface command to exit the current 
    // application.
    private Command exitCommand  = new Command("Exit", 
      Command.EXIT, 2);
    // User interface command to issue an HTTP GET 
    // request.
    private Command getCommand = new Command("Get", 
      Command.SCREEN, 1);

    /// The current display object.
    private Display display;
    // The url to GET from the 'net.
    private String url;

    /**
     * Initialize the MIDlet with a handle to the 
     * current display.
     */
    public HelloNet() {
//        url = "https://127.0.0.1/hello.txt";
          url = "https://www.javacourses.com";
    display = Display.getDisplay(this);
    }

    /**
     * This lifecycle method should return immediately 
     * to keep the dispatcher
     * from hanging.
     */
    public void startApp() {
    showPrompt();
    }

    /**
     * Display the main screen.
     */
    void showPrompt() {
        String s = "Press Get to fetch " + url;
        TextBox t = new TextBox("Http Result", s, 
          s.length(), 0);
        t.addCommand(exitCommand);
        t.addCommand(getCommand);
        t.setCommandListener(this);
    display.setCurrent(t);
    }

    /**
     * Read the content of the page.
     */
    private void readContents(String request) {
    StringBuffer b = new StringBuffer();
    HttpConnection c = null;
        InputStream is = null;
    TextBox t = null;
    try {
        int len = 0;
        int ch = 0;
            c = (HttpConnection)Connector.open(url);
            c.setRequestMethod(HttpConnection.GET);
        is = c.openInputStream();

            // length of content to be read.
            len = (int) c.getLength();

        if ( len != -1) {
        // Read exactly Content-Length bytes
        for (int i =0 ; i < len ; i++ )
            if ((ch = is.read()) != -1)
            b.append((char) ch);
        } else {
                // Read till the connection is closed.
        while ((ch = is.read()) != -1) {
                    len = is.available() ;
            b.append((char)ch);
        }
        }
//            t = new TextBox("hello again....", b.toString(), 1024, 0);
              t = new TextBox("hello again....", b.toString(), (int)len, 0);
        }  finally {
           if (is!=null)
               is.close();
           if (c!=null)
               c.close();
        }

    display.setCurrent(t);
    }


    /**
     * Pause, discontinue....
     */
    public void pauseApp() {
    }

    /**
     * Destroy must cleanup everything.
     */
    public void destroyApp(boolean unconditional) {
    }

}


не проходит компиляция... Вылетает ошибка не могу победить 
Код
Building "HelloNet"
C:\WTK21\apps\HelloNet\src\HelloNet\HelloNet.java:7: HelloNet should be declared abstract; it does not define commandAction(javax.microedition.lcdui.Command,javax.microedition.lcdui.Displayable) in HelloNet
public class HelloNet extends MIDlet implements 
       ^
1 error
com.sun.kvem.ktools.ExecutionException
Build failed

Автор: Dancer 4.12.2006, 19:13
Дык нормальным английским языком написано, что нужно либо класс абстрактным делать либо метод имплементить в своём классе. Этот метод public void commandAction(Command c, Display d){}

Автор: casper200 5.12.2006, 09:47
hi Dancer

Спасибо танцор.
Не совсем понял что делать с 
Код
public void commandAction(Command c, Display d){}

но попробую тупо добавить в код.
Еще раз спасибо.

Автор: Dancer 5.12.2006, 12:52
Цитата(casper200 @  5.12.2006,  09:47 Найти цитируемый пост)
Не совсем понял что делать с 
Код
public void commandAction(Command c, Display d){}

Ну, если это не понятно - тогда нужно к первоисточниками (книжки по Java, плюс готовые примеры из WTK посмотреть. По возможности какую нибудь книжку для начинающих по J2ME)
Твой код имплементирует класс CommandListener то есть, ты в своём классе можешь сделать метод, который будет обрабытывать события от нажатия на софткеи телефона. Причём ты самостоятельно вводишь эти кнопки (exitCommand   и getCommand). Ты кнопки то ввёл, а для того чтобы обработать что на них кто-то нажал в какой-то момент времени, ты и имплементишь CommandListener, и после этого, настраиваешь, что обработкой на нажатия софткеев будет заниматься твой класс t.setCommandListener(this);, то есть, когда произойдёт нажатие на софткея при выведнном тобой TextBox, то будет вызываться специальный метод (commandAction(Command c, Display d)) для класса CommandListener, но CommandListener это интерфейс в котором есть определённые методы, то есть их имена даны и набор параметров передаваемых этим методам, а так же тип который возвращается данными методами, то есть методы эти пользователь обязан (ОБЯЗАН!!) самостоятельно написать (поведение и логику работы, и т.д.), ну или хотябы заглушки, ну или делать класс абстрактным, чтобы другой класс который будет от нашего астрактного класса наследоваться сам уже включал в себя имплементацию методов интерфейса. И так как твой класс имплементит метод commandAction из интерфейса CommandListener,  ты можешь проверить, что за командная кнопка нажата и на каком экранчике это произошло, и уже в зависимости от этого делать те или иные действия (то есть, добавить некий интерактив при работе с пользователем)

Ниже твой код, но с добавленным методом.

Код

import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;

//public class HelloNet extends MIDlet {
public class HelloNet extends MIDlet implements 
  CommandListener {

    // User interface command to exit the current 
    // application.
    private Command exitCommand  = new Command("Exit", 
      Command.EXIT, 2);
    // User interface command to issue an HTTP GET 
    // request.
    private Command getCommand = new Command("Get", 
      Command.SCREEN, 1);

    /// The current display object.
    private Display display;
    // The url to GET from the 'net.
    private String url;

    /**
     * Initialize the MIDlet with a handle to the 
     * current display.
     */
    public HelloNet() {
//        url = "https://127.0.0.1/hello.txt";
          url = "https://www.javacourses.com";
    display = Display.getDisplay(this);
    }

    /**
     * This lifecycle method should return immediately 
     * to keep the dispatcher
     * from hanging.
     */
    public void startApp() {
    showPrompt();
    }

    /**
     * Display the main screen.
     */
    void showPrompt() {
        String s = "Press Get to fetch " + url;
        TextBox t = new TextBox("Http Result", s, 
          s.length(), 0);
        t.addCommand(exitCommand);
        t.addCommand(getCommand);
        t.setCommandListener(this);
    display.setCurrent(t);
    }

    /**
     * Read the content of the page.
     */
    private void readContents(String request) {
    StringBuffer b = new StringBuffer();
    HttpConnection c = null;
        InputStream is = null;
    TextBox t = null;
    try {
        int len = 0;
        int ch = 0;
            c = (HttpConnection)Connector.open(url);
            c.setRequestMethod(HttpConnection.GET);
        is = c.openInputStream();

            // length of content to be read.
            len = (int) c.getLength();

        if ( len != -1) {
        // Read exactly Content-Length bytes
        for (int i =0 ; i < len ; i++ )
            if ((ch = is.read()) != -1)
            b.append((char) ch);
        } else {
                // Read till the connection is closed.
        while ((ch = is.read()) != -1) {
                    len = is.available() ;
            b.append((char)ch);
        }
        }
//            t = new TextBox("hello again....", b.toString(), 1024, 0);
              t = new TextBox("hello again....", b.toString(), (int)len, 0);
        }  finally {
           if (is!=null)
               is.close();
           if (c!=null)
               c.close();
        }

    display.setCurrent(t);
    }

    public void commandAction(Command c, Display d){
        if (c==exitCommand) {
            destroyApp(true);
        }
    }

    /**
     * Pause, discontinue....
     */
    public void pauseApp() {
    }

    /**
     * Destroy must cleanup everything.
     */
    public void destroyApp(boolean unconditional) {
         notifyDestroyed();
    }

}


Автор: casper200 5.12.2006, 22:03
Добрый вечер Танцор

Спасибо огромное... Весьма позновательно, теперь начинаю понимать основы. НО даже с данным методом (обработки нажатия софткеев) код не компилится...
У меня такая ошибка...
Код
Project settings saved
Building "HelloNet"
C:\WTK21\apps\HelloNet\src\HelloNet\HelloNet.java:7: HelloNet should be declared abstract; it does not define commandAction(javax.microedition.lcdui.Command,javax.microedition.lcdui.Displayable) in HelloNet
public class HelloNet extends MIDlet implements 
       ^
1 error
com.sun.kvem.ktools.ExecutionException
Build failed
 Я в ШОКЕ!!!. Чего еще не хватает? smile 

Автор: W0LF 5.12.2006, 22:54
Ну... ошибся немного Dancer....
Ты ж зри в строчку 
Цитата

C:\WTK21\apps\HelloNet\src\HelloNet\HelloNet.java:7: HelloNet should be declared abstract; it does not define commandAction(javax.microedition.lcdui.Command,javax.microedition.lcdui.Displayable) in HelloNet

и посмотри в эту - 
Код

public void commandAction(Command c, Display d){

различие ведь есть...
public void commandAction(Command c, Displayable d){

Автор: Antropoid 5.12.2006, 22:55
Цитата(casper200 @  5.12.2006,  22:03 Найти цитируемый пост)
Чего еще не хватает? 

замени
Код

public void commandAction(Command c, Display d){
...

Код

на
public void commandAction(Command c, Displayable d){
...

и еще, вообще-то, нужно делать, например, так:
Код

private void readContents(String request) throws IOException {


ой! WOLF опередил  smile 

Автор: Vladimir35 6.12.2006, 00:18
при чем тут https? smile 

Автор: Dancer 6.12.2006, 11:48
да точно public void commandAction(Command c, Displayable d){}

Сорри, лоханулся Я! (писал прям здесь, так сказать от руки. Нет бы передовой технологией Copy-Paste воспользоваться.)

А https тут при том, что судя по коду, человек что-то хочет по этому протоколу попередавать, но не зная откуда проблема вылазиет, решил тему именн так и обозвать. (хотя..... с https у него после того как сможет скомпилить свою прогу, вопросы точно возникнут smile ). Можно сказать - название темы, для будующих вопросов smile

Автор: casper200 8.12.2006, 05:12
hi all 
Ребята спасибо за отзывы... Не понимаю как Вы пишите на этой хрени...
Заменил в соответствии с Вашими советами и разъеснениями строку. И вылезла еще куча ошибок. Просто руки опускаются. Пойду пучить шары (глаза в смысле), анализировать код.

P.S. М.б. кто то писал приложения, которые бы коннектились по https к сайту? Помогите плиз.
1. Есть ли особенность соединения при использованиии https? (а не http)
2. Обязательно ли наличие сертификата? (где взять как создать, и как запихать в приложение, для мобилы)
Может у кого есть живые (рабочие) примеры... То что дернул с sun.com, даже не компилится, сижу тупо смотрю в код и не понимаю % 60-70. Месяц вошкаюсь и не могу ничего родить!  smile 
Помогите плиз.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)