3

TClientSocket関数から回復する文字数の長さを設定しようとしましたがReceiveText、何も機能していないようです。たとえば、復元されたデータまたはその他のデータストリームから最初の左端の文字を受信します。この特定のオブジェクトを使用してDelphiでこれを実現する方法はありますか?

助けていただければ幸いです。前もって感謝します。

4

3 に答える 3

1

ここにテキストを送受信するためのちょっとしたヒントがあります

まず、YouTubeのテキストの長さも送信する必要があります

Socket.SendText(IntToStr(Length(text)) + seperator + text);

次に、受信テキストが完全であるかどうか、データストリームの受信時にサーバーソケットで確認できます。

procedure TMyServer.OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  if (xRecLength = 0) then begin
    if Length(Socket.ReceiveText) <= 0 then EXIT;
    xRecLength:= StrToIntDef(GetFirstFromSplitted(Socket.ReceiveText, seperator), -1);
    if xRecLength = -1 then EXIT;
  end;
  xActLength:= xActLength + Length(Socket.ReceiveText);
  xRecPuffer:= xRecPuffer + Socket.ReceiveText;

  isComplete:= xActLength = xRecLength;
  if isComplete then begin
    // complete text received
  end;
end;

それがあなたを助けることを願っています...

于 2012-02-08T07:58:03.470 に答える
1

ReceiveText受信したテキストの最大長を制御する手段はありません。

ClientType := ctBlockingモードでの最も簡単な方法はTWinSocketStream、ドキュメントに記載されているようにを使用することです。

http://docwiki.embarcadero.com/VCL/XE2/en/ScktComp.TClientSocket.ClientType

ClientTypeがctBlockingの場合、読み取りと書き込みにTWinSocketStreamオブジェクトを使用します。TWinSocketStreamは、読み取りまたは書き込み中に問題が発生した場合に、アプリケーションが無期限にハングするのを防ぎます。また、ソケット接続が読み取りの準備ができていることを示すのを待つこともできます。

コード例:

var
  Stream : TWinSocketStream;
  Buffer : TBytes;
  S      : string;
begin
  SetLength(Buffer, 100); // 100 bytes buffer size
  Stream := TWinSocketStream.Create(Socket, 5000); // 5 seconds or 5000 milliseconds
  try
    Stream.ReadBuffer(Buffer[0], Length(Buffer)); // raises an Exception if it couldn't read the number of bytes requested
    S := TEncoding.Default.GetString(Buffer); // Works in Delphi 2009+
  finally
    Stream.Free;
  end;
end;
于 2012-02-08T17:42:35.653 に答える
0

私はDelphiに慣れていませんが、Googleですばやく検索すると、このページが表示されReceiveText、パラメータを受け入れず、代わりに読み取り可能な範囲の文字列が返されます。

代わりにReceiveBufが必要になる場合があります。

于 2012-02-08T07:10:22.270 に答える