Показать сообщение отдельно
Старый 02.05.2012, 08:33   #12
AssA
AnyKey`щик
 
Аватар для AssA
 
Регистрация: 31.07.2011
Сообщений: 10
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Lib_binsock: прием/отправка бинарных данных через сокет

провел тест на LG ( gw300 ):

binsock.debug_register(0);
binsock.enable_debug(-1);

ansi:
отправил: 123фф123
на тел:123? ( len = 4 )
utf-8:
отправил: 123фф123
на тел: 123фф123 ( len = 8 )

binsock.debug_register(1);
binsock.enable_debug(1);

результат тот же, ошибок нет. после получения русских "вопросиков" мидлет продолжает работать. вот исходник теста: (в первом тесте процедуры onerror не было)

program testscr;
uses
  binsock;

var
  IsConn, l : integer;
  rx: string;
  b: integer;
  res: resource;

  cmOK: command;

procedure onerror(sender:Integer;exception:string;errstr:string;code:integer);
begin
  cmOK:= CreateCommand('OK',CM_OK,1);
  ShowAlert('Error #'+IntegerToString(code),'Exception: '+exception+chr(10)+chr(13)+'ErrorString: '+errstr, LoadImage('/icon.png'),ALERT_ERROR);
  repeat delay(200);
  until getClickedCommand = cmOK;
end;

procedure clr;
begin
  showCanvas;
  setFont(FONT_FACE_SYSTEM, 0, FONT_SIZE_SMALL);
  SetColor(0,0,0);
  fillRect(0,0, getwidth, getheight);
  SetColor(0,255,0);
end;

procedure txt(s: string; y: integer;);
begin
  drawtext(s, 5, y);
  repaint;
end;

begin
  // scr
  clr;

  // сокеты
  binsock.debug_register(1);
  binsock.enable_debug(1);

  // connect
  IsConn:= binsock.open( 'socket://xxxx:2286' );
  delay(3000);

  if IsConn=1
    then txt('connected!', 10)
    else halt;

  // loop
  repeat
    rx:= '';

    // read sock
    l:= binsock.available;
    while l>0 do begin
      rx:= rx + binsock.read_bin(l);
      l:= binsock.available;
    end;

    // show
    l:= length(rx);
    if l>0 then begin
      clr;
      txt( integertostring(GetCurrentTime), 10 );
      txt( 'rx len='+IntegerToString(l), 30  );
      txt( rx, 50 );
    end;

    delay(100);
  until GetKeyPressed <> KE_NONE;

end.
отправка с сервера в сокет выглядела так (delphi 2007):
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  us: UTF8String;
begin
  us:= AnsiToUtf8( Edit1.Text );
  for i:= 0 to ServerSocket1.Socket.ActiveConnections-1 do
    if CheckBox1.Checked then // птичка "отправлять в utf-8"
      ServerSocket1.Socket.Connections[i].SendText( us )
    else
      ServerSocket1.Socket.Connections[i].SendText( Edit1.Text );

end;
продолжил тесты:

функция binsock.read_byte возвращает именно байты. если пришел ansi - получим именно их коды, utf - по два байта на каждую русскую букву.

то есть засада в функции binsock.read_bin() - мне кажется, когда присваивается результат, NOKIA и LG воспринимают это по-разному: нокиа строго раскладывает побайтно, lg в этом потоке бинарных данных рассматривает utf8 символы и преобразует находу. можно ли и NOKIA заставить "распознавать" строку UTF-8 ?

Последний раз редактировалось AssA, 02.05.2012 в 09:43.
(Offline)
 
Ответить с цитированием