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


Автор: CubeCode 18.9.2006, 15:06
Привет всем!

Ту недавно я задумался о том, как написать Messegger на j2me. Точнее, не messenger, а хотя бы чат.

Проблема, с первого взгляда, несложная - просто каждый раз создаём StreamConnection или HttpConnection с GET запросом, читаем выходные данные и закрываем соединение. Остаётся проблема лишь в том, что телефон постоянно запрашивает разрешение на подключение. Как от этого избавиться?

 smile 

Автор: W0LF 18.9.2006, 18:06
Ищи на форуме. Здесь где-то было про подписанные мидлеты.

Автор: redrick 19.9.2006, 01:02
CubeCode, 
W0LF, канечно правильно написал, но вообще поведение зависит от девайса, многие спрашивают только один раз(и ты отвечаешь типа Yes to all)

Автор: javastic 19.9.2006, 08:57
Да, это зависит от телефона. Например в СониЭриках можно установить на приложение доступ: Запретить, Спрашивать Всегда или Спросить один раз. Подписанный мидлет не спрашивает, т.к. сертификат выдается доверительному приложению или игре. Сам сертификат стоит от $400.

Автор: CubeCode 19.9.2006, 14:43
Цитата(javastic @ 19.9.2006,  08:57)
Да, это зависит от телефона. Например в СониЭриках можно установить на приложение доступ: Запретить, Спрашивать Всегда или Спросить один раз. Подписанный мидлет не спрашивает, т.к. сертификат выдается доверительному приложению или игре. Сам сертификат стоит от $400.

Ну, это я понимаю. Но тут мне кто-то говорил на днях про Live Connection. Т. е. телефон, не разрывая HttpConnection, получает данные с web-страницы, каждый раз её обновляя, и посылая различные POST запросы через DataOutputStream. Вот какименно это реализовать - вот это непонятно.

Автор: W0LF 19.9.2006, 15:58
Иногда, может через одно http соединение пройти несколько пакетов. Но обычно оно разрывается и каждый раз создается новое. А в чем собственно проблема тогда? ну и пусть себе создается новое.

Автор: CubeCode 19.9.2006, 16:04
Вот, взгляните на код. Вроде всё правильно, но не работает - страница должна обновляться по таймеру, каждый раз посылая запрос
с параметром request_string, равным случайному числу.

Код

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


public class FirstExample extends MIDlet {

    private Display display;
    private _TimerTask task = null;
    private Timer timer = null;
    private HttpConnection httpc= null;
    private Random rnd = new Random();

    public FirstExample() {
       display = Display.getDisplay(this);
    }

    public void startApp() 
    {
        try
        {
            httpc = (HttpConnection)Connector.open("http://192.168.0.17/serg/test.php",Connector.READ_WRITE);
            httpc.setRequestMethod(HttpConnection.POST);
            httpc.setRequestProperty("user-agent", "Profile/MIDP-1.0 Configuration/CLDC-1.0");
            httpc.setRequestProperty("content-type", "application/x-www-form-urlencoded");            
            httpc.setRequestProperty("Cache-Control", "no-cache, must-revalidate");            
        }
        catch (IOException eoi){}
        task = new _TimerTask();
        timer = new Timer();
        timer.scheduleAtFixedRate(task,0,1000);
    }

    public void pauseApp() {
    
    }

    
    
    public void destroyApp(boolean unconditional) 
    {
        
    }
   

    
    void testConnection()
    {
        //HttpConnection connection = null;
        DataInputStream is = null;
        DataOutputStream dos = null;
        StringBuffer buffer = new StringBuffer();
        String request;
        int ch;
        TextBox box;

        try
        {
            //connection = (HttpConnection)Connector.open("http://192.168.0.17/serg/test.php");
            //is = connection.openInputStream();
            
            
            request = "request_str="+Integer.toString(rnd.nextInt());
            
            dos = httpc.openDataOutputStream();
            dos.write(request.getBytes());
            dos.flush();
            
            is = new DataInputStream(httpc.openDataInputStream()); 

            while ((ch = is.read()) != -1) buffer.append((char)ch);
            
            box = new TextBox("test",buffer.toString(),1024,0);
            display.setCurrent(box);
        }
        catch(IOException ioe) {}
        finally 
        {
            try
            {
            if (is!=null) {is.close();}
            if (dos!=null) {dos.close();}
            }
            catch(IOException ioe){};
        }

    }
    
    class _TimerTask extends TimerTask
    {
        public void run()
        {
            testConnection();
            
        }
    }

}


Ниже - код запрашиваемой страницы:

Код

<?
    $request_str = $_POST['request_str'];
    echo "Received value:".$request_str;
?>


В чем проблема???  smile 

Автор: W0LF 19.9.2006, 17:37
Я совсем не силен в php...
Попробуй убрать из 
Код

httpc = (HttpConnection)Connector.open("http://192.168.0.17/serg/test.php",Connector.READ_WRITE);

Код

Connector.READ_WRITE

Хотя вряд ли поможет
Так же попробуй добавить длину отправляемого пакета - 
Код

httpc.setRequestProperty("content-length", String.valueOf(request.length));

Но и это не факт

Добавлено @ 17:38 
А страница щас работает? в смысле дай мне линку, по которой я смогу к ней обратится..
И еще в catch поставь printStackTrace(), чтоб хотя бы увидеть че-то

Автор: W0LF 19.9.2006, 18:30
Цитата

ошибки во время отладки НУЖНО ВЫВОДИТЬ ВСЕГДА, а не оставлять кэтч пустым!!!!
Проверь свои настроки сетевые (файрвол, сервак, и всё такое)
плюс посмотри, что выводиться во время создания коннекшена

Цитировался Dancer
Думаю, он не обидится ;) 

Автор: javastic 20.9.2006, 09:23
CubeCode, а хоть один раз отрабатывает?

p.s. убери flush, на многих серваках он ничего не возвращает, а просто запрос висит.

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