ネットワーク VB6 | |
2台のコンピュータの一方から他方へデータを送り、そのデータに対応した結果が返却されるようなプログラムを考える。
例として、図のようにクライアント(処理を依頼する側)から英単語を送信するとサーバ(サービスを提供する側)から日本語訳が返却される「単語検索」プログラムを作成する。
実際問題として、ネットワークに接続されたコンピュータが身近にあればよいのだが、個人でコンピュータを2台用意して、LANで接続するのは経済的にも負担が大きく、用意できる人は少ないであろう。しかし、これから作成するプログラムは1台のコンピュータで動作確認ができるので、安心してチャレンジして欲しい。
サーバの処理
接続要求を受け付けるポート番号をLocalPortプロパティに設定して、Listenメソッドを呼び出し、接続要求が来るまで待ち続ける。
接続要求が来るとイベントが発生してConnectionRequestプロシージャが呼び出されるので、Acceptメソッドを呼び出して接続処理を完了する。
データを送信するには、SendDataメソッドを使い、受信するには、DataArrivalプロシージャ(データを受信すると呼び出される)でGetDataメソッドを使う。接続を切るには、Closeメソッドを呼び出す。
フォームの準備
新規フォームを用意し、プロパティを次のように設定する。
Caption … サーバ、 Height … 1500、 Width … 4800
フォームに次のようなコントロールを配置する。
テキストボックス(Text1)
Text … なし、 Height … 270、 Left … 120、 Top … 120、 Width … 4455
コマンドボタン(Command1)
Caption … 終 了、 Height … 375、 Left … 3360、 Top … 600、 Width … 1095
Winsock(Winsock1)
実行時には表示されないので適当な位置に配置する。大きさは固定である(サイズ変更できない)。
・プログラムリスト
Option Explicit '変数宣言を強制する Dim Word(1, 20) As String '単語登録用配列 Private Sub Command1_Click() '終了処理 Winsock1.Close 'ネットワーク切断 Unload Me End End Sub Private Sub Form_Load() Winsock1.LocalPort = 1001 '接続要求受付ポート番号設定 Winsock1.Listen '接続要求待ち '単語設定(登録) Word(0, 0) = "english" Word(1, 0) = "英語" Word(0, 1) = "apple" Word(1, 1) = "リンゴ" Word(0, 2) = "japan" Word(1, 2) = "日本" Word(0, 3) = "computer" Word(1, 3) = "コンピュータ" Word(0, 4) = "sun" Word(1, 4) = "太陽" Word(0, 5) = "moon" Word(1, 5) = "月" End Sub
単語登録用の配列wordはどこのプロシージャでも参照できるように、(General),(Declarations)で宣言する。配列の大きさは適当に20としている。配列の大きさが単語登録数になる。
終了処理では、プログラムを終了する前にネットワークを切断する命令(Winsock1.Close)を実行する。
実行時、最初に実行されるForm_Loadプロシージャで接続要求を受け付けるポート番号を設定し、接続要求を待つ。次に、単語を登録する。word(0,n)には英単語、word(1,n)には日本語訳を登録する。上のプログラムでは、6個だけ登録している。
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long) If Winsock1.State <> sckClosed Then 'Winsockの状態(閉じていない) Winsock1.Close 'Winsockを閉じる End If Winsock1.Accept requestID '接続処理 End Sub
クライアントから接続要求があるとConnectionRequestプロシージャが呼び出される。ここで、Winsock1の状態(Stateプロパティ※1)を調べ、閉じられていなければ(接続状態)閉じる処理をする。sckClosedはVBの定数である。
クライアントの情報は引数requestIDに記憶されているので、その情報を使ってAcceptメソッドを実行し接続を行う。
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim dat As String, ans As String 'dat=受信データ、ans=検索結果 Dim n As Integer Winsock1.GetData dat 'クライアントからデータを受信 Text1.Text = dat '英単語の検索処理 For n = 0 To 20 If dat = Word(0, n) Then '英単語発見 Winsock1.SendData Word(1, n) '日本語訳をクライアントに送信 Exit For End If Next n If n = 21 Then '発見できなかった Winsock1.SendData "わかりません" End If End Sub
クライアントからデータを受信するとDataArrivalプロシージャが呼び出される。実際にデータを受け取るにはGetDataメソッドを使う。
受信したデータdatを英単語リストword(0,n)と比較して、一致するものを検索する。0から20のForループで一致するものがなければ変数nは21になっているので、Forループの次に発見できなかったときの処理を書いている。
※1 Stateプロパティの値
|
クライアントの処理
接続したいサーバのコンピュータ名またはIPアドレスをRemoteHostプロパティに、サーバが接続要求を受け付けているポート番号をRemotePortプロパティに設定して、Connectメソッドを呼び出す。
データを送信するには、SendDataメソッドを使い、受信するには、DataArrivalプロシージャ(データを受信すると呼び出される)でGetDataメソッドを使う。接続を切るには、Closeメソッドを呼び出す。
フォームの準備
もう一つ、VisualBasicを起動して、新規フォームを用意し、プロパティを次のように設定する。
Caption … クライアント、 Height … 3600、 Width … 4800
フォームに次のようなコントロールを配置する。
ラベル(Label1)
Caption … ホスト名、 Left … 120、 Top … 0、 AutoSize … True
ラベル(Label2)
Caption … 送信データ、 Left … 120、 Top … 960、 AutoSize … True
ラベル(Label3)
Caption … 受信データ、 Left … 120、 Top … 1680、 AutoSize … True
AutoSizeプロパティはサイズを表示内容(Captionプロパティに設定された文字列データ)の大きさに合わせて自動的に変更するかどうかを設定するものである。Ture=サイズを自動的に変更する、False=サイズを自動的に変更しない。
テキストボックス(Text1)
Text … なし、 Height … 270、 Left … 120、 Top … 240、 Width … 3255
テキストボックス(Text2)
Text … なし、 Height … 270、 Left … 120、 Top … 1200、 Width … 3255
テキストボックス(Text3)
Text … なし、 Height … 270、 Left … 120、 Top … 1920、 Width … 4335
ボタン(Command1)
Caption … 接続、 Height … 375、 Left … 3480、 Top … 240、 Width … 975
ボタン(Command2)
Caption … 送信、 Height … 375、 Left … 3480、 Top … 1200、 Width … 975
ボタン(Command3)
Caption … 終了、 Height … 375、 Left … 3480、 Top … 2760、 Width … 1095
Winsock(Winsock1)
実行時には表示されないので適当な位置に配置する。大きさは固定である(サイズ変更できない)。
・プログラムリスト
Private Sub Command1_Click() Winsock1.Close '接続を閉じる Winsock1.RemoteHost = Text1.Text 'サーバのコンピュータ名設定 Winsock1.RemotePort = 1001 'ポート番号設定 Winsock1.Connect '接続する End Sub Private Sub Command2_Click() Winsock1.SendData Text2.Text 'データを送信する End Sub Private Sub Command3_Click() Winsock1.Close '接続を閉じる Unload Me End End Sub
3つのボタンの処理である。
Command1は接続のためのボタンで、Text1に入力された文字データをサーバのコンピュータ名として接続の処理を行っている。ポート番号は、サーバが接続要求を受け付けている番号と同じ番号である。
Comman2はデータ送信のためのボタンで、Text2に入力された文字データをサーバに送信する処理を行っている。
Command3は終了のためのボタンで、接続を閉じた後プログラムを終了している。
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim dat As String
Winsock1.GetData dat 'サーバからのデータ受信
Text3.Text = dat
End Sub
サーバからデータを受信するとDataArrivalプロシージャが呼び出される。実際にデータを受け取るにはGetDataメソッドを使う。クライアント側では、受信データをText3に表示しているだけである。
Copyright © 2001 Hiroshi Masuda |