ПрограммированиеФорумСеть

j2me + сокеты = потеря сообщений

#0
20:53, 24 янв 2012

Разрабатываю систему:
- Сервер под линукс, на С++
- Клиент на Java для мобильников
Связь через сокеты. Пока писал - тестировал на локальной машине, все работало идеально.
Залил серверную часть на хост и возникли проблемы. А именно, клиентская часть на Java принимает примерно 1 из 20-30 сообщений, остальные теряются. (Отправка работает нормально, все сообщения до сервера доходят). Проблема и на эмуляторе и на реальных телефонах. При этом при соединении телнетом или клиентом на С++ все работает нормально: и принимает и отправляет все сообщения.

Код:

//  Открываем соккет
sc = (SocketConnection) Connector.open ("socket://" + main.host + ":" + Integer.toString (main.port));

//  Открываем потоки ввода/вывода
is = sc.openInputStream ();
os = sc.openOutputStream ();

//  Делаем объект класса Sender - отправки сообщений
main.sender = new netSender (os);

//  Бесконеный цикл
while (true)
{
    //  Буффер, куда получаем сообщение
    byte buffer[] = new byte [1024];
    //  Пытаемся читать из потока ввода
    int c = is.read (buffer, 0, 1024);
    //  Если байтов получили 0 или меньше - разрыв соединения
    //  Ну и выходим из цикла
    if (c <= 0) break;

    //  Далее обработка принятого сообщения......
}

Идей, почему так происходит, вообще нет. Если кто сталкивался с подобной проблемой или видит ошибку в коде - отпишитесь.

#1
12:09, 25 янв 2012

Решил. Не хочет работать:

int c = is.read (buffer, 0, 1024);

Заменил на чтение по символам и заработало.

#2
20:38, 28 янв 2012

а че пишешь то?
я тож с похожей системой работаю, клиент на j2me, сервер на delphi и под мастдая)))

#3
1:13, 29 янв 2012

Ты думаешь сервер будет присылать тебе ровно нарезанные по 1024 байта кусочки?
Если ты так читаешь по 1024 - то приходить будет неровными кусками, и иногда будет ждать до полного 1024байтового блока.
При отсылке сообщения приписываешь в начало её длину например 4 байта, и с другой стороны делаешь сначала read(4) раскодируешь его как целое число и делаешь read(1024) или сколько осталось до полного сообщения, склеиваешь его как франкенштейна из заплаток. Собранное из кусочков франкеншейн-сообщение правильной длины уже можно обрабатывать.

#4
10:00, 29 янв 2012

Веллкам в реальную сеть. Когда тестировал эмуляцию плохого соединения проводил? К тому же для любого стандартного протокола, есть проверка доставки сообщения (к примеру TCP, у UDP такого нет), т.е. двусторонняя связь. В простом приближении: клиент запросил; сервер отправил; клиент подтвердил что все принял.

#5
11:49, 2 фев 2012

darkdysha
> а че пишешь то?
Систему для курьерской фирмы. Чтобы курьеры могли на телефоне брать заказы, видеть состояние заказа, статистику и т.п.

kvakvs
> Ты думаешь сервер будет присылать тебе ровно нарезанные по 1024 байта кусочки?
> ...
Уже понял. =) Я думал, что 1024 - это размер буфера. И в результате должны получить количество прочитанных байт.

ПрограммированиеФорумСеть

Тема в архиве.