#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 байта)