TRL:Terminal Request Library
ターミナルリクエストライブラリ

TrlServerLib(Windows版)- VB.NETでの利用

インストール方法
  1. PC上にダウンロードした「TrlServerLib.dll」を「参照」してください。
  2. ローカルにコピーした場合は、「TrlServerLib.dll」と同じフォルダ(DebugまたはRelease)に「TrlSupport.dll」と「TrlSupport64.dll」を置いて下さい。

※開発したPC以外に、アプリケーションと共に配布する場合は、「TrlServerLib.dll」と「TrlSupport.dll」と「TrlSupport64.dll」をアプリケーション(.exeファイル)と同じフォルダに配置してください。



アンインストール方法
  1. PC上にダウンロードしたファイルをフォルダごと削除してください。


使用方法

クラスの宣言
 Formクラス内で、TrlServerLib.Serverクラスを宣言してください。
Public Class Form1

    Private WithEvents objTrlServer As TrlServerLib.Server

End Class

インスタンスの作成と破棄
 FormのLoadイベントなどでServerクラスのインスタンスを作成します。
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load

    objTrlServer = New TrlServerLib.Server

End Sub
 FormのFormClosedイベントなどでServerクラスのインスタンスを破棄します。
Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs) Handles Me.FormClosed

    objTrlServer = Nothing

End Sub

通信待ち受けの開始と終了
 ButtonのClickイベントなどに、待ち受け開始と終了のロジックを追加します。下記の例ではButtonのTextを"通信開始"としておきます。TrlStartで待ち受けスレッドを開始した場合、プログラム終了前に必ずTrlStopを実行する必要があります。
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click

    Dim strErrorMessage As String = ""

    If Button1.Text = "通信開始" Then
        If objTrlServer.TrlStart( _
            TrlServerLib.Server.TRL_THREAD_MODE.mMulti, _
            CInt(TextBox1.Text), _
            strErrorMessage, "") = True Then
            
            Button1.Text = "通信停止"
        Else
            Call MsgBox(strErrorMessage, vbExclamation)
        End If
    Else
        Call objTrlServer.TrlStop()
    End If

End Sub
TrlStartメソッド
クライアントからの通信待ち受けを開始します。 Public Function TrlStart( _ ByVal pintThreadMode As TrlServerLib.Server.TRL_THREAD_MODE, _ ByVal pintPort As Integer, _ ByRef pstrErrorMessage As String, _ ByVal pstrReserved As String) As Boolean
引数内容
pintThreadMode TrlServerLib.Server.TRL_THREAD_MODE型
mMulti
複数の端末からのイベントが同時に発生する可能性があります。

mSingle
一度に発生するイベントは一つだけです。イベントは順番待ちとなります。
pintPort Integer型
通信を待ち受ける為のTCPソケット番号(65000~65500を推奨)。他のアプリケーションと重ならない値を渡してください。
pstrErrorMessage String型
メソッドが失敗した場合に、エラーメッセージが返されます。
pstrReserved String型
現在未使用です。空文字列("")を指定してください。
戻り値
Boolean型
True
待ち受け成功です。

False
待ち受け失敗です。エラーメッセージが、pstrErrorMessageに格納されています。
TrlStopメソッド
クライアントからの通信待ち受けを終了します。 Public Sub TrlStop()

イベントプロシージャの定義
 コードの表示画面の上段にあるドロップダウンリストの「クラス名」で「objTrlServer」を選択します。
続いて、ドロップダウンリストの「メソッド名」で「TrlServerEvent」を選択するとイベントプロシージャがコード内に現れます。

以下の例では、通信状況を表示するためListBoxをひとつフォーム上に配置しています。
クライアントから以下の3種類のリクエストを処理する例を記載しています。
  1. 商品名問い合わせ
    • クライアントからのリクエスト情報(pstrData)には、"0001"(処理区分)に続いて商品コードがセットされていると想定。
    • 商品コードでデータベースを検索し、商品名をレスポンス情報として返す。
  2. 商品画像問い合わせ
    • リクエスト情報には、"0002"(処理区分)に続いて商品コードがセットされていると想定。
    • 商品コードでデータベースを検索し、商品画像ファイルのパスを取得し、クライアントへ画像ファイルを送信。
    • 正常応答のレスポンス情報を返す。
  3. 日報報告
    • リクエスト情報には、"0003"(処理区分)に続いて日報ファイル名がセットされていると想定。
    • 日報ファイル名を使用して、クライアントから日報ファイルを受信。
    • 正常応答のレスポンス情報を返す。
Private Sub objTrlServer_TrlServerEvent( _
    ByVal pobjHandle As Object, _
    ByVal pintStatus As TrlServerLib.Server.TRL_STATUS, _
    ByVal pintCommandSerialNumber As Integer, _
    ByVal pstrIp As String, _
    ByVal pstrClientKey As String, _
    ByVal pstrData As String, _
    ByVal pstrErrorMessage As String) Handles objTrlServer.TrlServerEvent

    Dim strItemName As String
    Dim strItemPicturePath As String
    Dim strFuncError As String

    Select Case pintStatus

        Case TrlServerLib.Server.TRL_STATUS.mListenerInfo

            Call mdlSetControl(MDL_CONTROL.ListBox, "[Server]" & pstrData)

        Case TrlServerLib.Server.TRL_STATUS.mListenerError

            Call mdlSetControl(MDL_CONTROL.ListBox, "[Server]" & pstrErrorMessage)
            Call mdlSetControl(MDL_CONTROL.Button, "通信開始")

        Case TrlServerLib.Server.TRL_STATUS.mListenerStop

            Call mdlSetControl(MDL_CONTROL.ListBox, "[Server]" & pstrData)
            Call mdlSetControl(MDL_CONTROL.Button, "通信開始")

        Case TrlServerLib.Server.TRL_STATUS.mClientAccept

            Call mdlSetControl(MDL_CONTROL.ListBox, "[" & pstrIp & "/" & pstrClientKey.TrimEnd & "]" & "接続されました。")

            Select Case pstrData.Substring(0, 4)

                Case "0001" '商品名問い合わせ

                    If mdlGetItemName(pstrData.Substring(4), strItemName, strFuncError) = True Then
                        Call objTrlServer.TrlResponse(pobjHandle, 1, "1:" & strItemName)
                    Else
                        Call objTrlServer.TrlResponse(pobjHandle, 1, "0:" & strFuncError) '商品名問い合わせ失敗
                    End If

                Case "0002" '商品画像問い合わせ

                    If mdlGetItemPicrture(pstrData.Substring(4), strItemPicturePath, strFuncError) = True Then
                        Call objTrlServer.TrlSendFile(pobjHandle, 1, strItemPicturePath, "ItemPicture.jpg", "")
                    Else
                        Call objTrlServer.TrlResponse(pobjHandle, 2, "0:" & strFuncError) '商品画像問い合わせ失敗
                    End If

                Case "0003" '日報報告

                    Call objTrlServer.TrlRecvFile(pobjHandle, 1, _
                        pstrClientKey.TrimEnd & "_" & pstrData.Substring(4), pstrData.Substring(4))

            End Select

        Case TrlServerLib.Server.TRL_STATUS.mClientSuccess

            Select Case pstrData.Substring(0, 4)

                Case "0001" '商品名問い合わせ

                    If pintCommandSerialNumber = 1 Then
                        Call mdlSetControl(MDL_CONTROL.ListBox, "[" & pstrIp & "/" & pstrClientKey.TrimEnd & "]" & "Response成功")
                    End If

                Case "0002" '商品画像問い合わせ

                    If pintCommandSerialNumber = 1 Then
                        Call mdlSetControl(MDL_CONTROL.ListBox, "[" & pstrIp & "/" & pstrClientKey.TrimEnd & "]" & "SendFile成功")
                        Call objTrlServer.TrlResponse(pobjHandle, 2, "1:") '商品画像問い合わせ成功
                    ElseIf pintCommandSerialNumber = 2 Then
                        Call mdlSetControl(MDL_CONTROL.ListBox, "[" & pstrIp & "/" & pstrClientKey.TrimEnd & "]" & "Response成功")
                    End If

                Case "0003" '日報報告

                    If pintCommandSerialNumber = 1 Then
                        Call mdlSetControl(MDL_CONTROL.ListBox, "[" & pstrIp & "/" & pstrClientKey.TrimEnd & "]" & "RecvFile成功")
                        Call objTrlServer.TrlResponse(pobjHandle, 2, "1:") '日報報告成功
                    ElseIf pintCommandSerialNumber = 2 Then
                        Call mdlSetControl(MDL_CONTROL.ListBox, "[" & pstrIp & "/" & pstrClientKey.TrimEnd & "]" & "Response成功")
                    End If

            End Select

            Case TrlServerLib.Server.TRL_STATUS.mClientError

                Call mdlSetControl(MDL_CONTROL.ListBox, "[" & pstrIp & "/" & pstrClientKey.TrimEnd & "]" & pstrErrorMessage)

    End Select
End Sub

Enum MDL_CONTROL
    ListBox = 0
    Button = 1
End Enum

Private Sub mdlSetListBox(ByVal pItem As String)

    ListBox1.Items.Insert(0, Format(Now(), "yyyy/MM/dd HH:mm:ss") & pItem)

End Sub

Private Sub mdlSetButton(ByVal pText As String)

    Button1.Text = pText

End Sub

'--- TrlServerEventはメインスレッドとは別のスレッドから呼ばれるのでInvokeによるアクセスが必要となります。
'--- Invokeに関してはインターネット上に詳しい情報がありますので、説明は省略します。
Private Sub mdlSetControl(ByVal ptypControl As MDL_CONTROL, ByVal pstrValue As String)

    Dim aFunc As Action(Of String) = Nothing

    Try
        Select Case ptypControl
            Case MDL_CONTROL.ListBox
                aFunc = New Action(Of String)(AddressOf mdlSetListBox)
            Case MDL_CONTROL.Button
                aFunc = New Action(Of String)(AddressOf mdlSetButton)
        End Select
        Invoke(aFunc, New Object() {pstrValue})
    Catch ex As Exception
    Finally
        aFunc = Nothing
    End Try

End Sub

'--- このロジックはTRLと直接関係ないため省略します。
Private Function mdlGetItemName(ByVal pstrItemCode As String, ByRef pstrItemName As String, ByRef pstrError As String) As Boolean
    ・・・
    '商品情報検索ロジック
    ・・・
End Function

'--- このロジックはTRLと直接関係ないため省略します。
Private Function mdlGetItemPicrture(ByVal pstrItemCode As String, ByRef pstrItemPicturePath As String, ByRef pstrError As String) As Boolean
    ・・・
    '商品画像検索ロジック
    ・・・
End Function

TrlServerEventイベント
クライアントからリクエストがあると発生します。 また、コマンドの実行結果や、待ち受けスレッドからの情報が報告されます。 Private Sub objTrlServer_TrlServerEvent( _ ByVal pobjHandle As Object, _ ByVal pintStatus As TrlServerLib.Server.TRL_STATUS, _ ByVal pintCommandSerialNumber As Integer, _ ByVal pstrIp As String, _ ByVal pstrClientKey As String, _ ByVal pstrData As String, _ ByVal pstrErrorMessage As String) Handles objTrlServer.TrlServerEvent
引数内容
pobjHandle Object型
この値はクライアント接続情報のクラスインスタンスです。コマンドを実行する際にそのまま渡してください。
pintStatus TrlServerLib.Server.TRL_STATUS型
mListenerInfo
待ち受けスレッドからの状況報告です。pstrDataに報告内容が格納されています。

mListenerError
待ち受けスレッドからのエラー報告です。pstrErrorMessageにエラー内容が格納されています。待ち受けスレッドは停止します。

mListenerStop
待ち受けスレッドからの終了報告です。pstrDataに終了した旨が格納されています。待ち受けスレッドは停止します。TrlStopが呼ばれると発生します。

mClientAccept
クライアントからのリクエストを受けたときに発生します。

mClientSuccess
クライアントへのコマンドが成功したときに発生します。TrlResponseの成功時である場合、クライアントは切断されます。

mClientError
クライアントへのコマンドが失敗したときに発生します。クライアントは切断されます。
pintCommandSerialNumber Integer型
コマンド実行時にセットするコマンドシリアル番号です。pintStatusがmClientSuccessやmClientErrorの場合に、そのままこの値がセットされてきます。どのステップのどのコマンドの結果を受け取ったのかの判断に使用できます。コマンド結果以外の場合は0がセットされてきます。
pstrIp String型
クライアントのIPアドレスです。どの端末からのリクエストかを判断できます。この値は、クライアントの切断まで、同じ値がセットされてきます。
pstrClientKey String型
クライアントからリクエスト時にセットされたクライアント情報です。コンピュータ名や端末番号などがセットされることを想定しています。これにより、どの端末からのリクエストかを判断できます。この値は、クライアントの切断まで、同じ値がセットされてきます。
pstrData String型
クライアントからリクエスト時にセットされたリクエスト情報です。この値はクライアントから任意の文字列をセットできるので、処理を判別したり情報を受け渡したりすることができます。この値は、クライアントの切断まで、同じ値がセットされてきます。
pstrErrorMessage String型
クライアントへのコマンドが失敗した場合などに、エラーメッセージが返されます。
TrlSendFileメソッド(コマンド)
クライアントへファイルを送信します。 ※ファイルは2MBまでの大きさのものしか送信できません。 Public Sub TrlSendFile( _ ByVal pobjHandle As Object, _ ByVal pintCommandSerialNumber As Integer, _ ByVal pstrLocalFilePath As String, _ ByVal pstrRemoteFileName As String, _ ByVal pstrFieldInfo As String)
引数内容
pobjHandle Object型
TrlServerEventイベントで受け取ったものをそのまま渡してください。
pintCommandSerialNumber Integer型
コマンドシリアル番号です。任意の値を設定してください。このコマンドを実行した結果通知をTrlServerEventで受け取る際、そのままこの値がセットされてきます。
pstrLocalFilePath String型
送信するファイルのパスを指定します。
pstrRemoteFileName String型
クライアント側で保存する時のファイル名です。
pstrFieldInfo String型
現在未使用です。空文字列("")を指定してください。
TrlRecvFileメソッド(コマンド)
クライアントからファイルを受信します。 ※ファイルは2MBまでの大きさのものしか受信できません。 Public Sub TrlRecvFile( _ ByVal pobjHandle As Object, _ ByVal pintCommandSerialNumber As Integer, _ ByVal pstrLocalFilePath As String, _ ByVal pstrRemoteFileName As String)
引数内容
pobjHandle Object型
TrlServerEventイベントで受け取ったものをそのまま渡してください。
pintCommandSerialNumber Integer型
コマンドシリアル番号です。任意の値を設定してください。このコマンドを実行した結果通知をTrlServerEventで受け取る際、そのままこの値がセットされてきます。
pstrLocalFilePath String型
受信したファイルを保存する時のパスを指定します。
pstrRemoteFileName String型
クライアント側の受信するファイル名です。
TrlResponseメソッド(コマンド)
クライアントへレスポンスを送信します。 Public Sub TrlResponse( _ ByVal pobjHandle As Object, _ ByVal pintCommandSerialNumber As Integer, _ ByVal pstrResponse As String)
引数内容
pobjHandle Object型
TrlServerEventイベントで受け取ったものをそのまま渡してください。
pintCommandSerialNumber Integer型
コマンドシリアル番号です。任意の値を設定してください。このコマンドを実行した結果通知をTrlServerEventで受け取る際、そのままこの値がセットされてきます。
pstrResponse String型
レスポンスとして送信する任意の文字列を指定してください。 ※送信できるレスポンスは1KBまでです。 なお、この引数はShift-JISにエンコードしてバイナリデータとして送信され、クライアント側で適切なエンコードに戻されます。よって、送信できる文字数は、すべてが半角文字であれば1024文字、すべてが全角文字であれば512文字ということになります。バイナリ情報などを送信したい場合は一旦ファイルに出力してから、TrlSendFileメソッドで送信してください。

ダウンロード
ファイル内容
20170207_TrlServerLib_Windows.zip バージョン1.0.0.0を配布します。
バージョン0.0.0.0から起動時ダイアログ表示を廃止したものです。
十分、動作ご確認の上、ご利用ください。
20160415_TrlServerLib_Windows.zip ベータ版(バージョン0.0.0.0)を配布します。十分、動作ご確認の上、ご利用ください。





累積:
今日:
昨日:
Copyright (C) 2016 森山商店 All Rights Reserved.