このポストにはアフィリエイトコンテンツが含まれています。
はじめに
リモートデスクトップ越しにホストPCを操作していると、別ホストで動作しているIP Messengerのメッセージ通知に気づけないことがありました。そこで、IP Messengerの「メッセージをHTTP POSTで転送する機能」を活用し、別ホストで受信したメッセージを自ホストに転送する仕組みを作りました。
本記事では、この転送機能とC#での受信アプリケーションの実装例をご紹介します。
背景と目的
- 背景
- 別ホスト(ホストA)でIP Messengerを常時起動している
- リモートデスクトップ経由で操作しているため、ホストA側にIP Messengerの新着メッセージが届いても気づきづらい
- 目的
- ホストAに届いたIP Messengerメッセージを自動でホストBに転送
- ホストBではポップアップで気付けるようにする
実現方法の概要
- IP Messengerの設定(送信側)
IP Messengerは、受信したメッセージをHTTP POSTで外部に転送する機能が備わっています。これを有効化し、転送先(ホストB)のURLを設定します。例えば、以下のような形式です。http://[ホストBのIPアドレス]:8080/
- C#アプリケーションの作成(受信側)
HttpListener
を使ってポート番号8080
を常時Listenし、POSTで送られてきたデータを受信- 受信データ(JSON)をデシリアライズして中身を取り出し、Windowsフォームの
MessageBox
で表示
- 注意事項
- Windowsで
HttpListener
を使う場合、ポートを解放して受信するには管理者権限が必要です。 - ポート番号を8080以外に変えたい場合や、特定の権限でポートを解放したくない場合は、
netsh
コマンドでURL ACLの設定変更を行う方法もあります。 - セキュリティ的には、社内LANなど限られたネットワーク内での利用が望ましいです。
- Windowsで
サンプルソースコード
以下が、実際に試して動作したC#のサンプルコードです。Newtonsoft.Json
を利用してJSONのパースを行い、簡単にポップアップ(MessageBox)を表示しています。
using System;
using System.IO;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json;
// JSONデータ用のクラス
public class MessageData
{
public string channel { get; set; }
public string username { get; set; }
public string text { get; set; }
}
public class Receiver
{
// HTTPリスナーで受信する非同期メソッド
public static async Task StartListener(string prefix)
{
HttpListener listener = new HttpListener();
listener.Prefixes.Add(prefix);
listener.Start();
Console.WriteLine("Listening on " + prefix);
while (true)
{
HttpListenerContext context = await listener.GetContextAsync();
if (context.Request.HttpMethod == "POST")
{
using (Stream body = context.Request.InputStream)
using (StreamReader reader = new StreamReader(body))
{
string json = await reader.ReadToEndAsync();
try
{
// Newtonsoft.Json で JSON をデシリアライズ
MessageData data = JsonConvert.DeserializeObject<MessageData>(json);
Console.WriteLine("Received message from: " + data.username);
Console.WriteLine("Message: " + data.text);
// ポップアップ通知を表示
ShowPopup(data);
}
catch (Exception ex)
{
Console.WriteLine("Error parsing JSON: " + ex.Message);
}
}
// レスポンスを返す
context.Response.StatusCode = 200;
byte[] responseBytes = System.Text.Encoding.UTF8.GetBytes("OK");
context.Response.ContentLength64 = responseBytes.Length;
await context.Response.OutputStream.WriteAsync(responseBytes, 0, responseBytes.Length);
context.Response.Close();
}
}
}
// MessageBox.Show を STA スレッドで実行するためのヘルパー
private static void ShowPopup(MessageData data)
{
Thread t = new Thread(() =>
{
MessageBox.Show($"User: {data.username}\nMessage: {data.text}",
"New IPMessenger Message",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
});
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
[STAThread]
public static void Main(string[] args)
{
// 接続するURLのプレフィックスを指定
// 実際にはホストBのIPアドレスに書き換えてください
string prefix = "http://(IPアドレス):8080/";
Task.Run(() => StartListener(prefix)).Wait();
}
}
ポイント解説
- HttpListener
listener.Start()
でポート待ち受けを開始します。GetContextAsync()
を待機してリクエストが来ると処理を継続します。- リクエストの内容を
StreamReader
で読み込むことでPOSTデータを取得できます。
- MessageBox表示
MessageBox.Show
はSTA(Single-Threaded Apartment)スレッド上で実行する必要があるので、Thread t = new Thread(() => {...})
で実行しています。
実行方法
- プロジェクトの準備
Visual Studioもしくは.NET環境でコンソールアプリケーションを作成し、上記ソースコードを貼り付けるNewtonsoft.Json
を使うために、NuGet
でNewtonsoft.Json
をインストール
- ビルド・実行
- 管理者権限で実行(または、管理者権限のコマンドプロンプトなどから起動)
- 例:
dotnet run
(プロジェクトフォルダ内) Listening on http://(IPアドレス):8080/
と表示されたら待ち受けが開始
- IP Messenger側の設定
- 転送先URLを
http://(IPアドレス):8080/
に設定 - JSON形式でメッセージがPOSTされるように設定を保存
- 転送先URLを
- 動作確認
- IP Messengerでメッセージを送信(ホストA → ホストB)
- 受信したらホストB側コンソールに
Received message from: ユーザー名
と表示され、メッセージがMessageBox
でポップアップ表示される
セキュリティ面の注意
HttpListener
を使用しているポートが外部に公開されていると、意図しないPOSTを受け取る可能性があります。- 社内ネットワークなど、安全が確保された環境で利用することを推奨します。
- 公開範囲を絞ったり、ファイアウォールやACL設定なども検討してください。
おわりに
本記事では、IP MessengerのHTTP POST転送機能を活用し、C#の簡単なリスナーアプリでメッセージを受信・ポップアップする方法を紹介しました。リモートデスクトップ中でも見逃さずにメッセージを確認できるメリットがあります。
実装におけるポイントは「ポート待受には管理者権限が必要な場合がある」点と、「STAスレッドでのMessageBox表示」です。環境や権限設定に合わせてカスタマイズしながら、快適なメッセージ管理にお役立てください。
このポストにはアフィリエイトコンテンツが含まれています。