Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Socket.ReceiveText + Delphi2009 = иероглифы


Автор: dbgrid 4.2.2010, 17:08
Здравствуйте...
использую ServerSocket и ClientSocket, при пересылке сообщения от клиента к серверу (или наоборот), приходят иероглифы...как получить из этого текст??

код для клиента
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
   ClientSocket1.Socket.SendText('hello world');
end;


код для сервера
Код

procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
 Caption:=Socket.ReceiveText;
end;


в результате получем
ИЕРОГЛИФЫ (скриншот не получилось вставить)))

p.s. кстати забыл сказать...судя по тому что пишут в интернете, такой глюк только в delphi 2009  

Автор: Alca 4.2.2010, 17:12
Ты подсоединился к китайской матрице!  smile 

Автор: kami 4.2.2010, 23:14
Цитата(dbgrid @  4.2.2010,  17:08 Найти цитируемый пост)
приходят иероглифы...как получить из этого текст??

Я не ставил себе D2009.
Если не сложно - приаттачьте сюда ScktComp.pas (или в каком там модуле находятся в D2009 TClient и ServerSocket), почти уверен в чем проблема, но нужно достоверно убедиться.

Автор: dbgrid 5.2.2010, 11:01
вот
пришлось расширение поменять))

Автор: kami 5.2.2010, 18:28
Вот она проблема и вырисовалась.
В D2009 тип string по умолчанию=WideString(или UnicodeString, не суть сейчас важно).
Смотрим на объявления функций в TCustomWinSocket&:
Код

function SendText(const S: [U]AnsiString[/U]): Integer;
function ReceiveText: string;

Итого - передаем как AnsiString, а принимаем тот же буфер как WideString. Неувязка smile
Одно из решений - использовать вместо SendText -> SendBuf
Код

if Length(MyStr)<>0 then
  ClientSocket1.Socket.SendBuf(myStr[1], Length(myStr)*SizeOf(Char));

Автор: Fess59 9.2.2010, 13:16
Была аналогичная проблема, решил вот так:

Код

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var s: AnsiString;
begin
    SetLength(s, Socket.ReceiveLength);
    SetLength(s, Socket.ReceiveBuf(Pointer(s)^, Length(s)));
    Memo1.Lines.Add (String(s));
    Memo1.Lines.Add('Получение данных');
end;



Автор: Artes 11.2.2010, 23:26
Цитата(Fess59 @ 9.2.2010,  13:16)
Была аналогичная проблема, решил вот так:

Код

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var s: AnsiString;
begin
    SetLength(s, Socket.ReceiveLength);
    SetLength(s, Socket.ReceiveBuf(Pointer(s)^, Length(s)));
    Memo1.Lines.Add (String(s));
    Memo1.Lines.Add('Получение данных');
end;

Спасибо! Очень помог. Можеш обьяснить вчем тут фишка?

Еще вопрос. Пробывал пересылать буфер типа 
Код

var
  S: ansistring;
  buf : TBytes; {array of byte}
....
begin
.....
     s:='tratata';
     buf:= ByteOf(S);
     L:=Length(buf);
.... ClientSocket.Socket.SendBuf (buf, L); 


на сервер приходит пустой буфер. Таже Delphi 2009. 
Подскажите в чем проблема.

Автор: Zemlyanov 22.2.2010, 20:09
Блин , поставил Delphi 2009 не могу найти ServerSocket и ClientSocket, до этого стоял Delphi 2006. В чем проблема?

Автор: Zemlyanov 22.2.2010, 22:02
Все разобрался.Надо было добавить компонент ,войди в меню Component выбери пункт Install Packages дальше Add, зайти в папку Bin и выбрать  файл dclsockets120.bpl 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)