2016-10-28 10 views
0

私はTClientSocketの代わりにTIdTCPClientを使用して、XE7を使用して、ScktCompコンポーネントを使用しているアプリをIndyに変換しています。現時点では、私はそれをコンパイルするために同等のものを入れているだけです。そのほとんどは、このスニペットを除いて、変換された:TClientSocketからIndyへの変換:ReceiveLengthと同等ですか?

私は

s := Socket.IOHandler.ReadLn 

に変換している

if (Socket.ReceiveLength > 0) then 
begin 
    s := Socket.ReceiveText; 

私はReceiveLengthには同等のものを持っていません。

アイデア?

答えて

1

IOHandler.ReadLn()は、ではありません。は、ReceiveText()と同等です。

ReceiveLength()は、ソケットのバッファに現在ある未読バイトの数を返します。 ReceiveText()は、生のバイトが現在ソケットのバッファにあるものを読み込み、string変数に返します。バッファサイズとしてReceiveLength()を使用して、ReceiveBuf()への1回の呼び出しのラッパーです。必要に応じて、それは関係なく、それはそれを達成するのにかかるどのように多くの読み込み(デフォルトでLF文字がある)指定されたターミネータを、遭遇しなくなるまで

IOHandler.ReadLn()

は、ソケットのバッファからのバイトでそれを埋める、IOHandler自身のメモリバッファから読み込みます。

Socket.CheckForDataOnSource(0); 
if not Socket.InputBufferIsEmpty then 
begin 
    s := Socket.InputBufferAsString; 

また、あなたがそのAByteCountパラメータを持つIOHandler.ReadBytes()がに設定することができます。

インディでReceiveLength()のは直接の翻訳はありません、しかし、あなたのスニペットに最も近い同等のIOHandler.CheckForDataOnSource()は、例えば、IOHandler.InputBufferAsString()続い呼び出すことであろう-1、その後、文字列に返されたバイト配列を変換します言われていること

buf := nil; 
Socket.ReadBytes(buf, -1); 
if buf <> nil then 
begin 
    s := BytesToString(buf); 

、私はあなたがReceiveText()を使用している理由を聞いています最初の場所。 という文字列を任意のバイトで返すので、ほとんどの通信ニーズには適しておらず、予測できない方法でテキストデータを分割でき、バイナリデータにはまったく適していません。ネットワークプロトコルには通常構造があり、TClientSocketの使用方法では、通常、手作業でバイトをバッファし、そのバッファから構造化データを解析するコードが必要です。Indyが扱うように設計されているものです。達成したい目標にもっと集中し、それを得る方法の詳細についてはあまり集中しないでください。整数を読み取る必要がある場合は、整数を読み取るようにIndyに依頼します。特定の長さの文字列を読む必要がある場合や、特定の区切り文字で終わる場合は、Indyに文字列を読ませてください。 Xバイトのブロックを読み取る必要がある場合は、IndyにXバイトの読み取りを依頼します。 Indyには、通常は手動で行う必要がある一般的なタスクを自動化するための多くの読み取り/書き込みメソッドがあります。

関連する問題