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


Автор: gregson 17.11.2009, 04:50
Код

   public void run() {
        try {
            sc = (SocketConnection) Connector.open("socket://" + FHost + ":" + FPort);
            sc.setSocketOption(sc.KEEPALIVE, 1);
            sc.setSocketOption(sc.RCVBUF, 16384);
        } catch (Exception e) { /*e.printStackTrace();*/ Stop(); return; }
        if (sc == null) return;
        try {
            is = sc.openInputStream();
            os = sc.openOutputStream();
        } catch (Exception e) { e.printStackTrace(); }
        try {
            FSender = new TCPSender(os);
            FSender.Wait();
        } catch (Exception e) { e.printStackTrace(); }
        FActive = true;
        int i = 0, k = 0;
        try {

            // added  
            tmrPing.enable(); // ping ON 
            ping = 0;
            // comment for disable pings

            while (FActive) {
                i = 0; k = 0;
                for (int a = 0; a < 4; a++) {
                    i = is.read();
                    if (i==-1) throw new DisconnectException();
                    k = k + ( i << ( 8 * (3 - a) ) );
                }
                if (( k < 1)|(k>16384)) throw new DisconnectException();
                byte[] x = new byte[k];
                is.read(x);

                // added
                if ((x.length == 1) && (x[0] == '!')) { // pong answer - "!"
                    ping--;
                    x = null;
                    continue;
                }

                Incoming = wuc.WinToUnicode(x);
                buffer.addElement(Incoming);
                MainMidlet.GetDisplay().flashBacklight(0);

                x = null;

                try { Thread.sleep(250); } catch (Exception e) {}
            }
        }
        catch (InterruptedIOException iioe) { Stop(); }
        catch (DisconnectException de) { Stop(); }
        catch(Exception e) { Stop(); e.printStackTrace(); }
    }


Проблема при попытке сервера отослать длинную строку, на разных моделях телефонов по разному: на одних соединение рвется при длине строки больше 1.5кб, на других и того меньше, на третьих вообще не рвется. Проблема проявляется только при использовании GPRS интернета, т.е. когда запускаю приложение через wifi соединение все отлично работает с любыми объемами.

Внимание вопрос (гонг!): В чем может быть причина разрыва соединение при получении телефоном длинной строки!?

            sc = (SocketConnection) Connector.open("socket://" + FHost + ":" + FPort);
            sc.setSocketOption(sc.KEEPALIVE, 1);
            sc.setSocketOption(sc.RCVBUF, 16384);

sc делал раньше streamconnection, сейчас поменял на socket чтобы установить размер буфера чтения, не помогло :/
также пробовали комментить строку
  try { Thread.sleep(250); } catch (Exception e) {}
на случай если данные идут подряд двумя пакетами это могло вызывать exception

исходим из того что сервер посылающий длинную строку отдает ее пакетизацию (!) протоколу TCP, но вообще-то пробовали и сервером разбивать строку на две и отсылать подряд чтобы длина отсылаемой строки не превышала 800 байт, результата особо небыло.

Протокол обмена подразумевает что сначала идет 4х байтовая длина строки, потом сама строка.
Телефон получает строку и успевает обработать ее и вывести на экран на долю секунды, потом происходит разрыв соединения с сервером.

Кстате eclipse ругается на sc.KEEPALIVE и sc.RCVBUF типа некорректно я их использую

Если нужны еще куски кода спрашивайте!

Автор: gregson 18.11.2009, 03:45
я что-то не то спросил? вопрос слишком ламерский? подскажите хоть где начать копать, в чем может быть отличие передачи данных через gprs, кроме скорости передачи!?

Автор: math64 18.11.2009, 11:28
Возможно, при использовании wap сообщение режется на мелкие кусочки, а при gprs нет. (но это только моё предположение)

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