ソケットの利用
2000/06/01 by K. Masaki
プログラムの概要
- チャットのサーバーと、汎用のクライアントプログラムです。接続設定をすることで、
クライアントやサーバーになることができます。
- 接続先がこのプログラムのサーバーの場合、ListBox(左下の空白)にそのサーバーに
繋がってるクライアントの一覧が出ます。一覧から選んだ相手にメッセージを送信できます。
- Memo(右側の上下の欄)は、上が受信したメッセージ、下が送信するメッセージを表示します。
- 接続先がこのプログラム以外のサーバーの場合、そのサーバーに対してのみメッセージが
送られます。
プログラム中でのソケットの処理の概要
- 変数初期化
- 初期設定(同じディレクトリのservice.txtからserviceとportの対応を読み込む)
- client mode を押すと、クライアントで接続を試みる
- 接続先にサーバーが居ないとエラーが出るので、エラー処理をする
- server mode を押されると、サーバーになる(ポートが空いてなければ、空いてるポート
を探す)
- 自分がサーバーの時にメッセージを送信する時は、メッセージの先頭に"server:"を付け
足して選択された送信先に送る。
自分がクライアントの時にメッセージを送る時は、相手が他のプログラムのサーバーだったら
メッセージをそのまま送る。このプログラムのサーバーだったら、選択された送信先の名前と
自分の名前をメッセージの先頭に付け足してシステムメッセージとして送る。
- 自分がサーバーの時クライアントからデータが届いたら、自分に来たのか、システム
メッセージのか判断する。自分に来たなら、そのまま右上の欄に表示する。
- 自分がクライアントの時サーバーからデータが届いたら、システムメッセージかどうか
判断する。システムメッセージでなければ、そのまま右上の欄に表示する。
- disconnect を押されると、切断してその他の切断処理をする。
- show member を押されると、自分がサーバーだったら繋がってるクライアントの名前を
取得し直す。クライアントだったら、サーバーにクライアントの名前を送ってもらう
システムメッセージを送る。
- 自分がサーバーでクライアントが切断したときは、切断したクライアントの番号を探して
左下のクライアント一覧からそのクライアントを消して、既存のクライアントに番号を振り
なおして、切断したクライアントが誰かを知らせる。
- 新しくクライアントが接続してきたら、左下のクライアント一覧にそのホスト名を追加して
新しいクライアントに番号と他のクライアントの名前を教えて、既存のクライアントには
新しくクライアントが増えた事を教える。
プログラムのポイント
- ServerSocketの利用
- ClientSocketの利用
- ヘルプの活用
- 接続設定、環境設定の画面をPanelの中につくる事によって、PanelのVisibleプロパティを
変えるだけで設定画面を表示したり消したりできます。
- 各コンポーネントをまとまりごとにパネルの上に乗せて、そのパネルのAlignプロパティを
適切に変える事で、フォームの大きさを変更したりしても各コンポーネントの配置の
バランスが崩れないようになります。
プログラムの問題点
- 送信するデータが大きくて、一つのパケットで送れない場合、データの受け側では
受信データが複数のパケットに分かれて送られる事を想定してないため、正しくデータ
を受信できない。
プログラムのソース
masaki@tube.ee.uec.ac.jp