忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

Remoting の IPC を使ったプロセス間通信についてその2(HTTPチャネル)

前回投稿した以下の記事ですが、プロセス間通信の方法としてRemotingIPCを使用していました。
Remoting の IPC を使ったプロセス間通信について

今回は、HTTPチャネルを介してのプロセス間通信に変更してみます。 前回同様、1個のソリューショの中に以下の3個のプロジェクトを設置します。

  • クライアントとサーバーで共有するクラスDLL
  • サーバープロセスの実行PG(EXE)
  • クライアントプロセスの実行PG(EXE)


先ず、プロセス間通信の準備として、クライアントとサーバーで共有するクラスの宣言ですがこれは前回と全く同じものです。

クライアントとサーバーで共有するクラス

Public Class ServiceClass
    Inherits MarshalByRefObject

    'クライアントから呼び出しを受け、イベントを発生させる
    Public Sub RaiseServerEvent(ByVal message As String)
        'イベントを発生させる
        RaiseEvent RaiseClientEvent(message)
    End Sub

    Public Event RaiseClientEvent(ByVal messsage As String)

End Class

プロジェクトの定義は以下の様になります。



次に、サーバープロセスPGのプロジェクトを生成します。
1個のフォーム frmIpcServer をプロジェクトに追加し、そのフォーム上に1個のボタンとリッチエディットBOXを設置します。
フォームの静的変数として上記で説明した共有クラス(ServiceClass)の生成を行います。 また、ServiceClass から raise されるイベントの処理として、リッチエディットBOXに受信したメッセージを表示する為に、 デリゲート処理を宣言しています。
ボタンの押下によりHTTPの受信開始を行うのですが、以下の様な手順で行います。

  • HttpChannelによりHTTPチャネルを用意し、ChannelServices.RegisterChannel でチャネルを登録
  • RemotingServices.Marshal により共有クラスの参照許可
  • httpChannel.StartListening によりHTTPの受信を開始

サーバープロセスPG

Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Http
Imports IpcService

Public Class frmIpcServer

    'IPC用クラスの生成
    Private WithEvents IpcServiceClass As New IpcService.ServiceClass

    '受信回数
    Private mintRcv As Integer = 0

    '別プロセスからのメッセージを処理するためデリゲートを利用
    Delegate Sub SetRichTextBox1Delegate(ByVal Value As String)

    Private RichTextBox1Delegate As New SetRichTextBox1Delegate(AddressOf AppendTextRichTextBox1)

    'リッチテキストボックスにメッセージを表示する
    Private Sub AppendTextRichTextBox1(ByVal message As String)
        RichTextBox1.AppendText(message)
    End Sub

    '受信準備
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'HTTPチャネルを用意(ポートは8080を利用)
        Dim httpChannel = New HttpChannel(8080)
        ChannelServices.RegisterChannel(httpChannel, False)

        '「IpcServiceClass」を「ipcsample」で参照できるように設定
        Dim ref As ObjRef = RemotingServices.Marshal(IpcServiceClass, "ipcsample")

        'HTTP受信準備
        httpChannel.StartListening(Nothing)
        RichTextBox1.AppendText("HTTP channel is ready to receive." & vbNewLine)
    End Sub

    'IPC用クラスのイベント処理
    Private Sub IpcServiceClass_RaiseClientEvent(ByVal message As String) Handles IpcServiceClass.RaiseClientEvent
        'このイベント処理は、別プロセスのServiceClassからRaiseされるので、
        'このフォームのコントロールにアクセスするにはデリゲート処理を行う
        '(クライアントから受信したメッセージを処理)
        mintRcv += 1
        Me.Invoke(RichTextBox1Delegate, New Object() {mintRcv.ToString & ":" & message & vbNewLine})
    End Sub

End Class

尚、このプロジェクトの参照設定で以下のものを追加します。

  • System.Runtime.Remoting
  • IpcService



最後に、クライアントプロセスPGのプロジェクトを生成します。
1個のフォーム frmIpcClient をプロジェクトに追加し、そのフォーム上に1個のボタンとディットBOXを設置します。
フォームロード時に ChannelServices.RegisterChannel でHTTPチャネルの用意を行い、 RemotingConfiguration.RegisterWellKnownClientType でリモートサーバへの接続準備を行います。
ボタン押下時に IPC用クラスの生成を行い、そのクラスのイベント発生メソッドを実行し、メッセージ送信処理を行います。
尚、このプロジェクトの参照設定もサーバープロセスPGと同様です。

クライアントプロセスPG

Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Http
Imports IpcService

Public Class frmIpcClient

    'IPC準備
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'HTTPチャネルを用意する
        Dim channel As New HttpChannel(0)
        ChannelServices.RegisterChannel(channel, False)

        'リモートサーバへの接続準備
        RemotingConfiguration.RegisterWellKnownClientType(GetType(ServiceClass), "http://localhost:8080/ipcsample")
    End Sub

    'メッセージを送信する
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            'IPC用クラスの生成
            Dim IpcServiceClass As ServiceClass = New ServiceClass()
            'サーバへの通知(引数には、送信したいメッセージを指定)
            IpcServiceClass.RaiseServerEvent("Message From Client=>" & Me.TextBox1.Text)

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

End Class

このソリューションをデバッグ実行するために、ソリューションのプロパティを以下の図の様に設定します。

このソリューションをデバッグ実行すると以下の様になります。
サーバーPGの起動後、「Start HTTP Channel」ボタンを押下して HTTP 受信の準備を行います。 その後、クライアントPGのボタンを押下するごとに、サーバーPGにメッセージが表示されていきます。

PR

コメント

コメントを書く