Не удается отправить большой список через TCP-сокеты — Blackberry

#sockets #blackberry #java-me

#сокеты #ежевика #java-me

Вопрос:

Я пытаюсь отправить список из 600 записей через сокеты TCP / IP, используя Java-сервер и клиент Blackberry. Но каждый раз, когда он достигает 63-й записи, он останавливается, странная вещь в этом заключается в том, что если я отправляю только 200 записей, они отправляются нормально.

Я не смог понять, почему это происходит, только то, что 63 записи равны приблизительно 4 КБ, в основном он отправляет:

  • целое число с общим количеством записей, подлежащих отправке, И для каждой записи
  • целое число длиной в строку
  • строка
  • завершающий элемент строки «$ $$»

Поскольку мне нужно отправить все 600, я попытался закрыть InputStreamReader и снова открыть его, а также сбросить его, но без какого-либо результата.

Кто-нибудь еще сталкивался с подобным поведением? заранее благодарю.

Редактировать

Вот код, который получает:

 private String readfromserver() throws IOException {
    int len=_in.read(); // receives the string length

    if (len==0)     // if len=0 then the string was empty
        return "";
    else {
            char[] input = new char[len 1];

            for (int i = 0; i < len;   i) 
                input[i] = (char)_in.read();

            StringBuffer s = new StringBuffer();
            s.append(input);

            return s.toString();
    }       
} 

private void startRec(String data) throws IOException
{
    boolean mustcontinue=true;
    int len=_in.read();     // read how many records is about to receive

    if (len==0) {
        scr.writelog("There is no data to receive");
    }
    else {
        for(int i=0; i<len; i  )
            if (mustcontinue) {
                mustcontinue=mustcontinue amp;amp; showdata(readfromserver()); 
                    }
                else {                  
                    scr.writelog("Inconsistency error #19");                    
                }           
    }        
}
  

функция showdata отображает только полученную строку в поле LabelField.

Код на сервере:

 try {
  _out.write(smultiple.size()); // send the number of records 
  _out.flush();

  for (int x=0; x<smultiple.size(); x  )
  {
    int l=smultiple.elementAt(x).length();
    _out.write(l);  // send string length
      if (l>0)
        _out.write(smultiple.elementAt(x));         // send string

  }
    _out.flush();
} catch (Exception e) {
  principal.dblog(e.toString());
} 
  

smultiple — это вектор, содержащий строки, и у каждого уже есть терминатор $ $$.

Спасибо.

Комментарии:

1. Вероятно, это напрямую не связано с вашей проблемой, но вам не нужно отправлять как длину строки, так и ограничитель строки. Что, если отправляемая вами строка содержит «$$$»?

2. Можете ли вы включить соответствующий код blackberry в свой вопрос?

3. Поскольку я отправляю длину строки, я использую терминатор только для проверки, подходит ли строка, которую я получаю, вот почему я ее использую 🙂

4. Вы запускаете код приема в его собственном потоке? Если вы запускаете операции блокировки (чтения из сокета) в потоке событий, происходят плохие вещи.

5. @Richard да, у него есть свой собственный поток, он называется SyncThread. Я нашел «более или менее решение», закрыв соединение каждые 200 записей и перезапуская с последней полученной записи.

Ответ №1:

Я думаю, что 200 работает нормально, а 600 — нет, потому что последнее число больше, чем 255 🙂 Ваш код

 int len=_in.read();
  

вероятно, считывается байт, а не целое число (4 байта)