Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обмен данными между телефоном и компьютером, как наладить процесс обмена 
:(
    Опции темы
frutty
  Дата 27.4.2009, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.4.2009

Репутация: нет
Всего: нет



Необходимо наладить процесс обмена данными между мобильником и компьютером. Делаю через сокеты.
Мидлет:
Код

// ============== Блок отправки
            try 
            {
                String str = new String("Какая-нибудь строка");
                StringBuffer sb = new StringBuffer();
                sb.append((char)0); // Команда для приёма текста
                sb.append((char)str.length()); // Длина текста
                sb.append(str);
                sb.append("\r\n"); // Конец передачи
                dos.write(str.getBytes());
            } catch (IOException ex) 
            {
                ex.printStackTrace();
            }
// =========================
// ============== Блок приёма
            while (true)
            {
                try
                {
                    StringBuffer sb = new StringBuffer();
                    byte c = 0;
                    while ((((c = dis.readByte()) != '\n') && (c != -1)) && !socketStop ) 
                    {
                        sb.append((char)c);
                    }
                    String str = null;
                    byte[] buffer = sb.toString().getBytes();
                    if (buffer[0] == 0) { // Приём текста
                        byte count = (byte)buffer[1];
                        str = new String(buffer, 2, count);
                        addtolist("read:"+str, null);
                    }
                } catch (Exception iex) 
                {
                    iex.printStackTrace();
                    break;
                }
            }
// =========================


Сервер на Delphi
Код

procedure TSrvForm.DataAvailable(Sender: TObject; Error: Word);
var
    Buffer : array of char;
    i : Byte;      
    DataStr2 : TStringStream;
    i2 : Byte;
    Count2 : Integer;
    List2 : TList;
begin
  with (sender as TWSocket) do
  begin
    try
      Receive(@i, 1);
      if i = 0 then // Приём текста
      begin
        Receive(@i, 1);
        SetLength(Buffer, i);
        Receive(@Buffer, i);
// ===================== Готовим строку для клиента 
       DataStr2 := TStringStream.Create('');
          try
            i2 := 0;
            DataStr2.WriteBuffer(i2,1);
            i2 := Length(PChar(Buffer));
            DataStr2.WriteBuffer(i2,1);
            DataStr2.WriteString(PChar(Buffer));
            List2 := SocketList.LockList;
            try
              if List2.Count > 0 then
              begin
                for Count2 := 0 to List2.Count-1 do
                begin
                  TWSocket(List2.Items[Count2]).SendStr(DataStr2.DataString+#13#10); // Рассылаем всем подключившимся
                end;
              end;
            finally
              SocketList.UnlockList;
            end;
          finally
            DataStr2.Free;
          end;
// ==========================================
      end;
    finally
      ReceiveStr;
    end;
  end;
end;


До компа русский текст доходит хорошо, а вот обратно кракозябры. Испробовал очень много способов, перерыл этот и другие форумы, про readUTF я вкурсе, но это мне не подойдёт, т.к. за строкой может идти ещё какая-нибудь команда, а в readUTF нет границ считывания байт.
Так вот помогите пожалуйста решить эту проблему, либо посоветуйте другой метод обмена данными (фото, файлы, текст).
PM MAIL   Вверх
W0LF
Дата 27.4.2009, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



а кто Вас научил в стрингбуффер собирать байты от сервера?
Код

StringBuffer sb = new StringBuffer();
                    byte c = 0;
                    while ((((c = dis.readByte()) != '\n') && (c != -1)) && !socketStop ) 
                    {
                        sb.append((char)c);
                    }



--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
W0LF
Дата 28.4.2009, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Сори, по ходу в примерах так делают. Просто если читаете через DataInutStream то и писать нужно с помощью DataOutputStream. в общем суть в чем - если посмотреть на исходники DataInputStream то можно увидеть, что при считывании строки, например, сначала считывается длина строки и тп, для байта - только этот байт, в общем я к чему веду - можно использовать только InputStream.
Код

 InputStream is  = sc.openInputStream();


Код

ByteArrayOutputStream bStrm = new ByteArrayOutputStream();
                    int c = 0;
                    while ((((c = is.read()) != '\n') && (c != -1)) && !socketStop ) 
                    {
                        bStrm.write(c);                      
                    }
bStrm.close();
String str = null;
                    byte[] buffer = bStrm.toBytesArray();
//я так понимаю, что это Ваш протокол подразумевает два байта первых на вычитывание
if (buffer[0] == 0) { // Приём текста
                        byte count = (byte)buffer[1];
                        str = new String(buffer, 2, count, "UTF-8");
                        addtolist("read:"+str, null);
                    }

Плюс поиграйтесь с кодировками ("UTF-8" может там и не надо дописывать, мож там 1251)

Это сообщение отредактировал(а) W0LF - 28.4.2009, 00:11


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
math64
Дата 28.4.2009, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Телефон может не знать Cp1251
PM   Вверх
frutty
  Дата 28.4.2009, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.4.2009

Репутация: нет
Всего: нет



что за ёптваюмать уже весь мозг кипит, что-то я вообще не врюблюсь в процесс обмена, толи в JVM какие-то необычные базовые типы данных, толи в Delphi
Мидлет
Код

os.write((byte)12);
os.write("\n".getBytes());

Код

var
       i : byte;
begin
       AThread.Connection.ReadBuffer(i, SizeOf(i));
end;


Этот код работает и на сервере принимает байт равный 12, но если отсылать тип int происходит какая-то херня, приходят непонятные числа, причём чтобы на сервере произашёл приём нееобходимо отправить данные из мидлета 2 раза

Код

os.write((int)12);
os.write("\n".getBytes());

Код

var
       i : Integer;
begin
       AThread.Connection.ReadBuffer(i, SizeOf(i));
end;


В чём может быть ошибка? Как мне организовать обмен? Есть какие-нибудь идеи?
Ещё меня интересует: как отправить поток без символов конца строки, т.е. без os.write("\n".getBytes());?
PM MAIL   Вверх
math64
Дата 29.4.2009, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



write(int b) пишет один байт в поток
writeInt(int b) пишет 4 байта в поток, но старшим байтом вперёд, а Delph ждёт младшим байтом вперёд. Где-то нужно развернуть байты - либо в Java, либо в Delphi.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0766 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.