Разрабатываю систему:
- Сервер под линукс, на С++
- Клиент на 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;
// Далее обработка принятого сообщения......
}Идей, почему так происходит, вообще нет. Если кто сталкивался с подобной проблемой или видит ошибку в коде - отпишитесь.
Решил. Не хочет работать:
int c = is.read (buffer, 0, 1024);
Заменил на чтение по символам и заработало.
а че пишешь то?
я тож с похожей системой работаю, клиент на j2me, сервер на delphi и под мастдая)))
Ты думаешь сервер будет присылать тебе ровно нарезанные по 1024 байта кусочки?
Если ты так читаешь по 1024 - то приходить будет неровными кусками, и иногда будет ждать до полного 1024байтового блока.
При отсылке сообщения приписываешь в начало её длину например 4 байта, и с другой стороны делаешь сначала read(4) раскодируешь его как целое число и делаешь read(1024) или сколько осталось до полного сообщения, склеиваешь его как франкенштейна из заплаток. Собранное из кусочков франкеншейн-сообщение правильной длины уже можно обрабатывать.
Веллкам в реальную сеть. Когда тестировал эмуляцию плохого соединения проводил? К тому же для любого стандартного протокола, есть проверка доставки сообщения (к примеру TCP, у UDP такого нет), т.е. двусторонняя связь. В простом приближении: клиент запросил; сервер отправил; клиент подтвердил что все принял.
darkdysha
> а че пишешь то?
Систему для курьерской фирмы. Чтобы курьеры могли на телефоне брать заказы, видеть состояние заказа, статистику и т.п.
kvakvs
> Ты думаешь сервер будет присылать тебе ровно нарезанные по 1024 байта кусочки?
> ...
Уже понял. =) Я думал, что 1024 - это размер буфера. И в результате должны получить количество прочитанных байт.
Тема в архиве.