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


Автор: Nemesis 21.8.2006, 18:01
Доброго дня всем!
У меня есть небольшая проблемка, надеюсь, вы поможите мне ее решить. Каким образом я могу проверить работоспособность мидлета, который устанавливает HttpConnection с сервером? Дело в том, что удаленного сервера пока нет и тестировать нужно в локальных  рамках, т.е. как бы мне приконнектиться к localhost и передать туда массив байтов (по идее на сервак передается изображение). Я так понимаю нужно еще писать свою небольшую прогу (сервер), которая бы прослушивала какой-то порт на моем компе.. или как? просто не имел дела с подобными вещами. 
Заранее спасибо!

Автор: Dancer 21.8.2006, 18:35
я обычно поднимаю Apache у себя на компе, делаю скрипт нужный мне на перле (иногда JSP использую с котом Томом, Tomcat) и таким вот макаром отрабатываю взаимодействие с сеткой моего мидлета.

Автор: Nemesis 21.8.2006, 18:44
 smile ох елы палы  smile  да уж, пожалуй дождусь сервака тогда. 
Dancer, а скажи пожалуйста, с httpConnection часто возникают проблемы? Мне вот по сути просто передать массив байтов - картинку, на сервак..

Автор: Dancer 21.8.2006, 18:50
ды я бы не сказал что большие проблемы возникают.
Как и с обычным потоком работаешь. Вроде бы ничего такого...... smile
А чем тебя так испугало поднятие локального сервака? (очень удобно для разработки, ИМХО конечно, но а по другому то как?)
Можно конечно написать мидлет, который у тебя будет как сервер работать, его запускать первым, потом запускть твоего клиента, можно и так рабоать. Кстати, посмотри в примеры WTK там такой мидлетик точно есть.

Всё делается на локальной машине, не нужно никакой сетки. Очень не плохо отлаживать код (просто на ошибки). В сетке уже нужно смотреть как будет быстродействие, сетка отваливаться и всё такое.  А просто код погонять - лишь локальный сервак (всё ИМХО)

Добавлено @ 18:52 
музыку я гонял с сервака, организовывл протокол передачи данных между мидлетом и специфическим серваком, нормально всё шлётся, проблем никаких smile. Посмотри примеры из WTK

Автор: Nemesis 21.8.2006, 19:06
Оки, пасибо! Вот со 2ым мидлетом-сервером, хорошая идея, надо будет попробовать. 

Автор: javastic 22.8.2006, 09:16
Цитата(Nemesis @ 21.8.2006,  18:44)
Мне вот по сути просто передать массив байтов - картинку, на сервак..

Придётся кодировать бинарные данные. А серверный скрипт должен декодировать и сохранять это дело на диск.
Я пол года назад делал приложение которое фоткает со встроеннй камеры, а затем передаёт изображение на сервак.

Автор: redrick 22.8.2006, 12:13
Nemesis
Dancer, тоже пользуюсь апачем для этих целей - имхо оно того стоит - один раз научишься - и потом экономишь время.

Автор: Nemesis 22.8.2006, 21:39
Да, вы правы, надо научиться этому делу  smile 
Если можно, еще кое что... У меня проблема появилась с записью в исходящий поток..
Вот я делаю в новом потоке след действия:
Код

public void run()
    {
        try
        {
            sc = (SocketConnection) Connector.open("socket://localhost:5000");
            
            os = sc.openOutputStream();
            
            if(imageData != null)
            {
             System.out.println("sending data...");
             for(int i=0; i<imageData.length; i++)
                 os.write(imageData[i]);
            }
            
            
            if(os != null)
             os.close();
            
            if(sc != null)
             sc.close();
            
        }
        catch(Exception exc)
        {
            exc.printStackTrace();
        }
        
    }

Но у меня предчувствие, что в os ничего не записывается... 

Вот тут, в другом потоке, я считываю данные:

Код

public void run()
    {
        try
        {
            ssc = (ServerSocketConnection) Connector.open("socket://:5000");
            
            sc = (SocketConnection) ssc.acceptAndOpen();
            is = sc.openInputStream();

            while (true) 
            {
                int tmpData[] = new int[5000];
                int i = 0;
                int c = 0;
                
                while(((c = is.read()) != '\n') && (c != -1)) 
                {
                    tmpData[i] = c;
                    i++;
                }

                if (c == -1) 
                {
                 imageData = new int[i];     // [I]кол-во i - определяется правильно, 45*45 (размер картинки)[/I]
                 System.arraycopy(tmpData, 0, imageData, 0, imageData.length); // [I]а вот данные все 0[/I]
                 isDone = true;
                 tmpData = null;
                    break;
                }
            }
            
            if(is != null)
             is.close();
                     
            if(ssc != null)
             ssc.close();
            if(sc != null)
             sc.close();
            
        }
        catch(Exception exc)
        {
            exc.printStackTrace();
        }
        
    }


javastic, а вот по поводу кодировки, это для уменьшения объема данных? Или для чего? 
P.S. Ты знаешь, у меня практически точно такое же задание  smile 

Автор: redrick 22.8.2006, 22:24
Nemesis, по поводу кода - а какова природа imageData ?

Цитата(Nemesis @  22.8.2006,  21:39 Найти цитируемый пост)
javastic, а вот по поводу кодировки, это для уменьшения объема данных? Или для чего? 
P.S. Ты знаешь, у меня практически точно такое же задание  smile  

прямые конкуренты )

Автор: Nemesis 22.8.2006, 22:29
redrick, imageData - это массив int`ов, полученный с помощью метода 
getRGB(int[] imageData, int offset, int scanlength, int x, int y, int width, int height)

Цитата(redrick @  22.8.2006,  23:24 Найти цитируемый пост)
прямые конкуренты )

Ага, забавно)) Хотя он говорит, что уже делал.. 

Автор: javastic 23.8.2006, 09:08
Цитата(Nemesis @ 22.8.2006,  21:39)
javastic, а вот по поводу кодировки, это для уменьшения объема данных? Или для чего? 
P.S. Ты знаешь, у меня практически точно такое же задание  smile

У тебя оно сейчас, у меня уже было smile
Объем наоборот вырастит. А надо чтобы данные не побились. Например когда отсылается атачмент вместе с электронным письмом он кодируется алгоритмом  mime64.

Добавлено @ 09:10 
Цитата(Nemesis @ 22.8.2006,  22:29)
Ага, забавно)) Хотя он говорит, что уже делал..

Вот результат работы http://oko.awardspace.com/test.php

Могу выложить само приложение, если хочешь протестировать.

Автор: Dancer 23.8.2006, 09:20
ну, вообще-то INT ты не можешь гонять через OutputStream и InputStream, тебе можно лишь с массивом byte работать. Так что нужно перевдить. Получаешь из массива INT массив BYTE, и этот массив уже шлёшь. На принимающей стороне, получаешь массив BYTE, преобразуешь его к массиву INT и получаешь уже свою картинку через Image.createImage()

при использовании вот этого ты получаешь BYTE (int read()) и только BYTE, никак не INT.
Код

public abstract int read()
                  throws IOExceptionReads the next byte of data from the input stream. The value byte is returned as an int in the range 0 to 255. If no byte is available because the end of the stream has been reached, the value -1 is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown. 
A subclass must provide an implementation of this method. 


Returns:
the next byte of data, or -1 if the end of the stream is reached. 
Throws: 
IOException - if an I/O error occurs.



ну и пишеться тоже smile)), соответственно BYTE. 
Код


public abstract void write(int b)
                    throws IOExceptionWrites the specified byte to this output stream. The general contract for write is that one byte is written to the output stream. The byte to be written is the eight low-order bits of the argument b. The 24 high-order bits of b are ignored. 
Subclasses of OutputStream must provide an implementation for this method. 


Parameters:
b - the byte. 
Throws: 
IOException - if an I/O error occurs. In particular, an IOException may be thrown if the output stream has been closed.


Автор: Nemesis 23.8.2006, 18:50
javastic, не подумай, что я не поверил тебе ) просто пишем одно и то же получается.. 

Цитата(javastic @  23.8.2006,  10:08 Найти цитируемый пост)
Объем наоборот вырастит. А надо чтобы данные не побились. Например когда отсылается атачмент вместе с электронным письмом он кодируется алгоритмом  mime64.

Вот так дела... а не дашь пару ссылочек полезных, где про это почитать можно?


Dancer, спасибо, сегодня попробую перевести в byte, забавно ))

Автор: javastic 24.8.2006, 10:16
Вот алгоритм base64, можешь из него выкинуть методы декодирования (оставив только кодировку) чтобы занимал в твоей проге меньше места. А декодировать будешь на серверной стороне.

Код

/* Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The  above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE. */

package Files;

import java.io.*;

public class Base64 {

    static final char[] charTab =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
            .toCharArray();

    public static String encode(byte[] data) {
        return encode(data, 0, data.length, null).toString();
    }

    /** Encodes the part of the given byte array denoted by start and
    len to the Base64 format.  The encoded data is appended to the
    given StringBuffer. If no StringBuffer is given, a new one is
    created automatically. The StringBuffer is the return value of
    this method. */

    public static StringBuffer encode(
        byte[] data,
        int start,
        int len,
        StringBuffer buf) {

        if (buf == null)
            buf = new StringBuffer(data.length * 3 / 2);

        int end = len - 3;
        int i = start;
        int n = 0;

        while (i <= end) {
            int d =
                ((((int) data[i]) & 0x0ff) << 16)
                    | ((((int) data[i + 1]) & 0x0ff) << 8)
                    | (((int) data[i + 2]) & 0x0ff);

            buf.append(charTab[(d >> 18) & 63]);
            buf.append(charTab[(d >> 12) & 63]);
            buf.append(charTab[(d >> 6) & 63]);
            buf.append(charTab[d & 63]);

            i += 3;

            if (n++ >= 14) {
                n = 0;
                buf.append("\r\n");
            }
        }

        if (i == start + len - 2) {
            int d =
                ((((int) data[i]) & 0x0ff) << 16)
                    | ((((int) data[i + 1]) & 255) << 8);

            buf.append(charTab[(d >> 18) & 63]);
            buf.append(charTab[(d >> 12) & 63]);
            buf.append(charTab[(d >> 6) & 63]);
            buf.append("=");
        }
        else if (i == start + len - 1) {
            int d = (((int) data[i]) & 0x0ff) << 16;

            buf.append(charTab[(d >> 18) & 63]);
            buf.append(charTab[(d >> 12) & 63]);
            buf.append("==");
        }

        return buf;
    }

    static int decode(char c) {

        if (c >= 'A' && c <= 'Z')
            return ((int) c) - 65;
        else if (c >= 'a' && c <= 'z')
            return ((int) c) - 97 + 26;
        else if (c >= '0' && c <= '9')
            return ((int) c) - 48 + 26 + 26;
        else
            switch (c) {
                case '+' :
                    return 62;
                case '/' :
                    return 63;
                case '=' :
                    return 0;
                default :
                    throw new RuntimeException(
                        "unexpected code: " + c);
            }
    }

    /** Decodes the given Base64 encoded String to a new byte array.
    The byte array holding the decoded data is returned. */

    public static byte[] decode(String s) {

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {

            decode(s, bos);

        }
        catch (IOException e) {
            throw new RuntimeException();
        }
        return bos.toByteArray();
    }

    public static void decode(String s, OutputStream os)
        throws IOException {
        int i = 0;

        int len = s.length();

        while (true) {
            while (i < len && s.charAt(i) <= ' ')
                i++;

            if (i == len)
                break;

            int tri =
                (decode(s.charAt(i)) << 18)
                    + (decode(s.charAt(i + 1)) << 12)
                    + (decode(s.charAt(i + 2)) << 6)
                    + (decode(s.charAt(i + 3)));


            os.write((tri >> 16) & 255);
            if (s.charAt(i + 2) == '=')
                break;
            os.write((tri >> 8) & 255);
            if (s.charAt(i + 3) == '=')
                break;
            os.write(tri & 255);

            i += 4;
        }
    }
}

Автор: Nemesis 24.8.2006, 21:26
javastic, спасибо большое!!!

Автор: Nemesis 25.8.2006, 21:15
Всем привет! Вроде все работает и на сервак заливается изображение... Еще раз всем спасибо!
Но столкнулся с еще одной проблемой: разрешение картинки чрезмерно мизерно и неприемлемо (160х120), увеличение разрешения картинки (при помощи изменения imageType в getSnapshot(imageType) ) не меняет ситуации, получается картинка, скажем 640х480, которая делается путем простого "растягиавния" 160х120... качество соответственно не очень, если не сказать грубее smile... 
Скажите, кто-нибудь плотно работал с камерой телефона? есть ли возможность получать нормальные фотки? Такое ощущение, что фокус сбит и фоты получаются смазанными и очень расплывчатыми. Камера 1.3 Мпикселя. Фоты получаемые при помощи съемки стандартными средствами получаются четкими.. 

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