TIdUDPServerで日本語文字列を送受信するには

日本語の文字列を送信するには、文字列のエンコーディングを指定して送信します。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  //文字列をUTF8で送信する
  IdUDPServer1->Send("127.0.0.1", 12345, "てすと", TEncoding::UTF8); //自分自身に送信
}

受け取ったときにはバイト列を文字列にデコードします。

void __fastcall TForm1::IdUDPServer1UDPRead(TIdUDPListenerThread *AThread, _ARRAYOF BYTE* AData,
          const int AData_Size, TIdSocketHandle *ABinding)
{
  //受け取ったバイト列をデコードする
  UTF8String s((char*)AData, AData_Size + 1);
  …
}

次のサンプルプログラムは「ソケットライブラリのIndyを利用したクリップボード共有ソフト:CodeZine」の「UDPの基本的な使い方」のを参考にしました。

フォームにTIdUDPServer・TButton・TMemoを貼り付けます。

TIdUDPServer01

ソースコードは次のようになります。

__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  // コンポーネントの設定
  Memo1->Text = "";
  IdUDPServer1->DefaultPort = 12345; //適当なポートを使用
  // UDPサーバーを起動する
  IdUDPServer1->Active = true;
}
//---------------------------------------------------------------------------
// ボタンを押したら自分に対し'test'を送信する
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  //文字列をUTF8で送信する
  IdUDPServer1->Send("127.0.0.1", 12345, "てすと", TEncoding::UTF8); //自分自身に送信
}
//---------------------------------------------------------------------------
// データを受信した時
void __fastcall TForm1::IdUDPServer1UDPRead(TIdUDPListenerThread *AThread, _ARRAYOF BYTE* AData,
          const int AData_Size, TIdSocketHandle *ABinding)
{
  //受け取ったバイト列をデコードする
  UTF8String s((char*)AData, AData_Size + 1);
  Memo1->Lines->Add(s);
}

TIdUDPServer02

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください