• 検索結果がありません。

通信対戦プログラム

N/A
N/A
Protected

Academic year: 2021

シェア "通信対戦プログラム"

Copied!
10
0
0

読み込み中.... (全文を見る)

全文

(1)

プログラムの概要

Winsock コントロールを使用すると、リモートコン ピュータに接続し、データを交換出来る事を利用し て、チャット(通信雑談システム)を作成する。 サーバー、クライアント共に、背景色が黄色のテキ ストボックスに必要項目を入力し、設定ボタンをク リックすると、通信が確立し、チャットを開始する 事が出来る。 送信用テキストボックスに送信文を入力して送信ボ タンをクリックすると、テキストが送信される。送 信文、受信文共に、受信用テキストボックスに逐次 表示される。 猶、通信状況等は、下部のステータスバーに、其の 時の状態が表示される。

チャット

VB⑤ □ 単純変数の宣言(Dim) □ 標準コントロールの利用(Label、Option、Command、Text、Frame) □ プロパティの値の取得と設定(Standard: BackColor、Text、Value、Caption) □ プロパティの値の取得と設定(Winsock: State、RemoteHost、RemotePort、LocalIP 等) □ イベントの利用(Load、Click、ConnectionRequest、DataArrival) □ メソッドの利用(Close、Listen、Connect、Accept、SendData、GetData、SetFocus) □ ステートメントの利用(Unload、End、Exit Sub) □ 組込関数の利用(Val、RGB、DoEvents)

□ 制御構造構文(条件分岐 If ~ Then … Else … End If、ループ処理 Do ~ Loop) □ 演算子(代入演算子、比較演算子、結合演算子) □ ActiveXコントロールの利用(プロジェクト→コンポーネント→コントロール) 今回の課題項目 □ StatusBar コンポーネントの利用(Panels 等) □ Winsock コンポーネントの利用(Protocol、RemoteHost、RemotePort、Listen、Connect 等) 今回の重点項目 □ 送受信文の画面表示を工夫する。 今回の応用項目

(2)

■ コンポーネント(ActiveX コントロール)の組込 ■

1.メニューバーより『プロジェクト』→『コンポーネント』と進む。

2.『コンポーネント』ダイアログボックスが表示されるので、下記のコントロールを選択する。

Microsoft Winsock Control 6.0 と Microsoft Windows Common Control 6.0

3.上記の操作で、ツールボックス内に夫々れのアイコンが追加される。 VB でソケット通信を行うには、仲介役と成るコントロ ー ル が 必 要 と 成 り ま す 。 今 回 は ソ ケ ッ ト 通 信 用 に Winsock を、ステータス表示に StatusBar を使用しま す。標準コントロールでは無いので、普段はツールボッ クス内に表示されて居ません。標準コントロール以外の コントロールを使用出来る様にするには、コンポーネン トを組み込む必要が有ります。 上記のコントロールは、通常、システムフォルダに下記 のファイル名で保存されて居ます。

Microsoft Winsock Control 6.0 mswinsck.ocx

Microsoft Windows Common Control 6.0 mscomctl.ocx

(3)

■ オブジェクト・プロパティ一覧 ■ コントロールの種類 プロパティ プロパティの設定値 フォーム オブジェクト名 Form1 Caption チャット フレーム1 オブジェクト名 fraSet Caption、Font 設定(MS明朝,太字,9) フレーム2 オブジェクト名 fraSelect Caption 空白 オプションボタン1 オブジェクト名 optServer Caption サーバー オプションボタン2 オブジェクト名 optClient Caption クライアント Value True ラベル1 オブジェクト名 lblLocal Caption ローカル ラベル2 コマンドボタン1 オプションボタン1 フレーム1 ラベル3 テキスト1 オプションボタン2 Winsock ラベル1 ラベル4 ラベル5 フレーム2 フレーム3 フレーム4 テキスト3 テキスト5 コマンドボタン2 テキスト2 テキスト4 テキスト6 テキスト7 テキスト8 コマンドボタン3 コマンドボタン4 ステータスバー

(4)

コントロールの種類 プロパティ プロパティの設定値 ラベル2 オブジェクト名 lblRemote Caption リモート ラベル3 オブジェクト名 lblAddress Caption アドレス ラベル4 オブジェクト名 lblPort Caption ポート ラベル5 オブジェクト名 lblName Caption 名前 テキストボックス1 オブジェクト名 txtAddressL Text 192.168.1.1 テキストボックス2 オブジェクト名 txtAddressR Text 192.168.1.2 テキストボックス3 オブジェクト名 txtPortL Text 1001 テキストボックス4 オブジェクト名 txtPortR Text 1002 テキストボックス5 オブジェクト名 txtNameL Text 空白 テキストボックス6 オブジェクト名 txtNameR Text 空白 コマンドボタン1 オブジェクト名 cmdSet Caption 設定 フレーム3 オブジェクト名 fraSx Caption 送信 テキストボックス7 オブジェクト名 txtSx Text 空白 コマンドボタン2 オブジェクト名 cmdSend Caption 送信 フレーム4 オブジェクト名 fraRx Caption 受信 テキストボックス8 オブジェクト名 txtx Text 空白 MultiLine True ScrollBars 3-両方 ソケット オブジェクト名 sckCOM Protocol 0 - sckTCPprotocol ステータスバー オブジェクト名 staInfo 最小幅 5000 - - サイズ自動設定 1-sbrSpring 配置 - 1-sbrCenter 1-sbrCenter スタイル - 6-sbrDate 5-sbrTime コマンドボタン3 オブジェクト名 cmdClear Caption 消去 コマンドボタン4 オブジェクト名 cmdFinish caption 終了

(5)

フレーム 他のコントロールをグループ化するコントロール。通常、チェックボックスやオプションボ タンと共に使用し、フレーム自体は、特定の機能を持たない。 オプションボタン 複数の選択肢の中から1個だけを選択するコントロール。チェックボックスとは異なり、1 個のグループの中で選択出来るオプションボタンは1個だけで有る。 ラベル テキストを表示するコントロール。此のテキストは、ユーザーが直接入力したり変更したり する事は出来ない。 テキストボックス テキストの入力や表示を行うコントロール。此のテキストは、ユーザーが直接入力したり変 更したりする事が出来る。 コマンドボタン ユーザーが選択したコマンド(命令)や操作を実行するコントロール。OKボタンや実行ボ タン等、処理の開始や中断・終了の合図に用いられ、最も良く利用されるコントロールです。 ソケット(Winsock) TCPネットワークサービス、及び、UDPネットワークサービスへアクセスする機能を提 供するActiveX コントロール。此のコントロールを使用すると、TCP又はUDPを使用し てリモートコンピュータに接続し、送受信双方向のデータ交換を行う事が出来る。孰れのプ ロトコルでも、クライアント及びサーバーアプリケーションを作成出来る。 中央のサーバーに送るユーザー情報を集めるクライアントアプリケーションの作成、複数の ユーザーから集めたデータの中央コレクションポイントとして機能するサーバーアプリケー ションの作成、チャットアプリケーションの作成等に利用される。 ステータスバー(StatusBar) 通常、親フォームの下端に表示されるウィンドウで、アプリケーションの各種ステータス情 報の表示に使用されるActiveX コントロール。ステータスバーコントロールは、文字列、及 び、ピクチャを含むPanel オブジェクト(最大16個)で構成され、通常、フォーム上のオ ブジェクトに関する情報、オブジェクトの構成要素に関する情報、オブジェクトの其の時に 行える操作に関する情報等を表示する。 デザイン時には、パネルを作成し、ステータスバーコントロールの『プロパティページ』ダ イアログボックスの『パネル』タブで各種値を設定して其の外観をカスタマイズする事が出 来る。

TCP(Transmission Control Protocol)

TCPプロトコルは、コネクション型のプロトコルで有り、電話に例える事が出来る。ユー ザーは、接続を確立してから処理を行う必要が有る。亦、一旦接続が確立すると、TCPプ ロトコルでは、接続が持続され、非常に大きなファイル等でもデータの完全性が保証される が、多くのリソースが使用される

UDP(User Datagram Protocol)

UDPプロトコルは、コネクションレス型のプロトコルで有り、メモ伝言に例える事が出来 る。1台のコンピュータから別のコンピュータにメッセージが送られるが、両者は明示的に 接続されて居ない。亦、各送信データの最大サイズは、ネットワークに依り決まる。

(6)

■ プログラムリスト ■

Option Explicit

' フォームが読み込まれた時の処理 Private Sub Form_Load( )

' 自機のIPアドレス・名前を取得する txtAddressL.Text = sckCOM.LocalIP txtNameL.Text = sckCOM.LocalHostName ' 入力必須項目を指示する txtAddressR.BackColor = RGB(255, 255, 128) txtPortR.BackColor = RGB(255, 255, 128) ' 接続状況を表示する staInfo.Panels(1).Text = "未接続" End Sub ' コマンドボタン(設定)がクリックされた時の処理 Private Sub cmdSet_Click( )

' ソケットが閉じて居ない場合は一旦閉じる

If sckCOM.State <> sckClosed Then sckCOM.Close ' サーバーの場合

If optServer.Value = True Then

Form1.Caption = "チャット:TCPサーバー" ' ローカルポート(自分)のポート番号を設定する sckCOM.LocalPort = Val(txtPortL.Text) ' ソケットを作成し接続要求受付モードに移行する sckCOM.Listen ' ステータスを表示する staInfo.Panels(1).Text = "接続受付中" ' クライアントの場合 Else Form1.Caption = "チャット:TCPクライアント" ' リモートホスト(相手)のアドレス・名前を設定する sckCOM.RemoteHost = txtAddressR.Text ' リモートポート(相手)のポート番号を設定する sckCOM.RemotePort = Val(txtPortR.Text) ' リモートコンピュータへの接続を要求する sckCOM.Connect ' ステータスを表示する staInfo.Panels(1).Text = "接続要求中" Do Until sckCOM.State = sckConnected DoEvents Loop staInfo.Panels(1).Text = "接続済" End If End Sub RemoteHost プロパティには 接続するコンピュータの名 前かIPアドレスを指定す る。 RemotePort プロパティには 接続するポートを指定する。 LocalIP プロパティで自機の 名前を、LocalHostName プ ロパティで自機のIPアド レスを取得する事が出来る。 クライアント側が設定する 必要の有る項目の背景色を 黄色に仕て居る。 ステータスバーの Panels コ レクションは1スタートで 有る。 State プロパティでソケット の様々な状態を取得する事 が出来る。 LocalPort プロパティには自 機の使用ポートを指定する。 Listen メソッドは、ソケット を作成し、接続要求を受け付 けるモードに移行する。 Connect メソッドは、リモー トコンピュータへ接続を要 求する。 無限ループに陥ら無い為に DoEvents 関数で、プログラ ムが占有して居る制御をオ ペレーティングシステムに 渡す。

(7)

' リモートマシンが接続を要求して来た時の処理

Private Sub sckCOM_ConnectionRequest(ByVal requestID As Long) ' サーバーで無い場合はプロシージャを抜ける

If optServer.Value = False Then Exit Sub ' リモートコンピュータの情報を表示する txtAddressR.Text = sckCOM.RemoteHostIP txtPortR.Text = sckCOM.RemotePort ' ソケットを一旦閉じて新しい接続を受け付ける

If sckCOM.State <> sckClosed Then sckCOM.Close sckCOM.Accept requestID

' ステータスを表示する

staInfo.Panels(1).Text = "接続受入-" & sckCOM.RemoteHostIP End Sub

' コマンドボタン(送信)がクリックされた時の処理 Private Sub cmdSend_Click( )

Dim S As String

' 送信テキストに改行を付加して送信する

S = txtNameL.Text & " > " & txtSx.Text & vbCrLf sckCOM.SendData S

' 送信テキストを一覧に表示する txtRx.Text = txtRx.Text & S txtSx.Text = ""

txtSx.SetFocus End Sub

' データを受信した時の処理

Private Sub sckCOM_DataArrival(ByVal bytesTotal As Long) Dim S As String

sckCOM.GetData S

txtRx.Text = txtRx.Text & S End Sub

' コマンドボタン(消去)がクリックされた時の処理 Private Sub cmdClear_Click()

txtRx.Text = "" End Sub DataArrival イベントは、新 しいデータが送信されて来 た時に発生する。 GetData メソッドは、現在の データブロック(受信デー タ)を取得し、其れを変数に 格納する。 SendData メソッドは、デー タをリモートコンピュータ に送信する。 此処で宣言した変数は宣言 したサブプロシージャ内で しか値の参照と設定を行う 事が出来ない。 サーバー側而巳が必要とす る処理で有る為、サーバーで 無い場合は、直ちにサブプロ シージャを抜ける。 RemoteHostIP プロパティで リモート機のIP アドレスを、 RemotePort プロパティでリ モート機のポート番号を取 得する事が出来る。 アンパサンド(&)は文字列 を結合する演算子で有る。 vbCrLf はVB定数で、改行 を意味する。 MultiLine プロパティを真に 設定したテキストボックス は32K迄の入力が可能だ が、時々消去して遣る事が望 ましい。

(8)

' コマンドボタン(終了)がクリックされた時の処理 Private Sub cmdFinish_Click( )

' ソケットを閉じる

If sckCOM.State <> sckClosed Then sckCOM.Close ' プログラムをメモリから消去して終了する Unload Me End End Sub ' オプションボタン(サーバー)がクリックされた時の処理 Private Sub optServer_Click( )

txtPortL.BackColor = RGB(255, 255, 128) ' 入力必須項目を指示する txtAddressR.BackColor = RGB(255, 255, 255) txtPortR.BackColor = RGB(255, 255, 255) End Sub ' オプションボタン(クライアント)がクリックされた時の処理 Private Sub optClient_Click( )

txtPortL.BackColor = RGB(255, 255, 255) ' 入力必須項目を指示する txtAddressR.BackColor = RGB(255, 255, 128) txtPortR.BackColor = RGB(255, 255, 128) End Sub アプリケーションを終了す る場合、ソケットは閉じてか ら終了する事が望ましい。 アプリケーションを終了す る場合、正しくプログラムを メモリから消去して終了す る事が望ましい。 TCP接続で、サーバー側が 設定する項目はLocalPort プ ロパティだけで有る。 TCP接続で、クライアント 側 が 設 定 す る 項 目 は RemoteHost プロパティ と RemotePort プロパティで有 る。 算術演算子 比較演算子 論理演算子 1.^ 冪乗 1.= 等しい 1.Not 否定 2.- 負数 2.<> 等しくない 2.And 論理積 3.*、/ 乗算と除算 3.< より小さい 3.Or 論理和 4.¥ 整数除算 4.> より大きい 4.Xor 排他的論理和 5.Mod 剰余 5.<= 以下 5.Eqv 同値 6.+、- 加算と減算 6.>= 以上 6.Imp 包合 算術演算子と論理演算子では、複数の演算子が使用されて居る場合には、頭に付けた番号の順序で 演算が行われる(上に書かれて居る演算子程優先順位が高い)。

(9)

Closeメソッドに依るソケットのクローズ(Winsock) ソケットをクローズするメソッド Object.Close TCP接続、又は、接続要求を受け付けて居るソケットを閉じる。クライアントアプリケー ションでもサーバーアプリケーションでも使用出来る。 オブジェクトにはWinsock コントロールを指定する。 Listenメソッドに依る接続要求の待受(Winsock) ソケットを作成し、接続要求を受け付けるモードに移行するメソッド Object.Listen TCP接続に於いてソケットを作成し、接続要求を受け付けるモードに移行して、クライア ントからの接続要求を待ち受ける。此のメソッドは、TCP接続でしか機能し無い。 オブジェクトにはWinsock コントロールを指定する。 接続要求が送られて来ると、ConnectionRequest イベントが発生する。接続を受け入れるには、 ConnectionRequest イベントのコード内で Accept メソッドを使用する必要が有る。 Connectメソッドに依る接続の要求(Winsock) リモートコンピュータへの接続を要求するメソッド Object.Connect 引数1,引数2 TCP接続を確立する際に、リモートコンピュータ(サーバー側)への接続を要求する。 オブジェクトにはWinsock コントロールを指定する。 引数1には、リモートコンピュータの名前を指定し、省略する事が出来る。 引数2には、リモートコンピュータのポートを指定し、省略する事が出来る。 Acceptメソッドに依る接続要求の受入(Winsock) 送られて来た接続要求を受け入れるメソッド Object.Accept 引数 TCP接続に於いて、クライアント側より送られて来た接続要求を受け入れる。此のメソッ ドは、サーバー側のConnectionRequest イベント内で而巳で使用する事が出来る。 オブジェクトにはWinsock コントロールを指定する。 引数1には、RequestID(ConnectionRequest イベントの引数)を指定し、省略する事は出来ない。 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説

(10)

SendDataメソッドに依るデータの送信(Winsock) データをリモートコンピュータに送信するメソッド Object.SendData 引数 引数で指定したデータをリモートコンピュータに送信する。 オブジェクトにはWinsock コントロールを指定する。 引数には、送信するデータ(数値、又は、文字列)を指定し、必ず指定する。 GetDataメソッドに依るデータの受信(Winsock) 現在のデータブロックを取得し変数に格納するメソッド Object.Bind 引数1, 引数2, 引数3 リモートコンピュータより受信したデータを引数1で指定した変数に格納する。 オブジェクトにはWinsock コントロールを指定する。 引数1には、取得したデータを格納する変数を指定し、必ず指定する。 引数2には、取得するデータの型を指定し、省略する事が出来る。 引数3には、取得するデータのサイズを指定し、省略する事が出来る。 機 能 書 式 解 説 機 能 書 式 解 説 TCP接続の確立の手順 サーバー側 クライアント側 RemotePort プロパティの設定 LocalPort プロパティの設定 Listen メソッドの実行(待受) ConnectionRequest イベント RemoteHost プロパティの設定 Connect メソッドの実行(接続要求) Accept メソッドの実行(受付)

参照

関連したドキュメント

高齢者 に優 しい交通環境 を整備す るため、バ リアフ リー対応型信号機 の整備、道 路標識 ・標示 の高輝度化等の整備