>> Home
  + Past histories
  + Links

>> download

>> documents
  + Archtecrure Guide
  + Configuration
  + Tutorial
  + API Guide
  + Seasar Service

>> samples
  + Naval Battle
  + Chat

>> BBS
  + geoboard
    (旧掲示板)

>> Mail To Amoi
Home > documents > Tutorial > Chapter 1
チュートリアル
第1章 Hello! World.
この章では、プログラミングの第1歩として定番の「Hello! World.」を実現するSockletを作成します。
Sockletクラスとは
まずは、リスト1.1のソースをご覧ください。
このソースで作成されるSockletは20行余りの非常にシンプルなもので、接続してきたクライアントに「Hello! World.」の文字を返し、その後はクライアントから送られてきたメッセージをそのまま加工せずに、接続中のすべてのクライアントへと送信します。

リスト1.1
 1: package jp.wda.gpss.samples.chap1;
 2: 
 3: import jp.wda.gpss.GeneralSocklet;
 4: import jp.wda.gpss.SocketProcessor;
 5: 
 6: public class HelloWorld extends GeneralSocklet {
 7: 	public boolean checkConnection(SocketProcessor client) {
 8: 		client.send("Hello! World.");
 9: 		return true;
10:  	}
11: 	
12: 	public void preRemoveClient(SocketProcessor client) {
13: 		sendToAllClients("A client went away...");
14: 		return;
15: 	}
16: 	
17: 	public boolean doCommand(SocketProcessor client, String command) {
18: 		sendToAllClients(command);
19: 		return true;
20: 	}
21: }
    

このプログラムソースの中身を詳しく見て行きます。
■Socklet宣言
 1から4行目までのパッケージ宣言とimport宣言については、Java言語初歩の内容なので説明しません。
 まずはじめに、重要な6行目のクラス宣言を見てみましょう。この行で「このクラスはSockletである」と宣言しています。
 「Sockletである」とはどういうことでしょうか。jp.wda.gpss.Sockletインターフェースを何らかの方法で実装することが、「Sockletである」 ことの条件であります。そして、そのインターフェースを実装しているjp.wda.gpss.GeneralSockletを継承することで、そこに用意されているさまざまなAPI関数を自由に利用できるSockletを作成することが出来るのです。つまりこのHelloWorld SockletもGeneralSockletを継承することにより、Sockletクラスとなるのです。

 では、インターフェースjp.wda.gpss.Sockletを見てみましょう。Sockletインターフェースには、11のメソッドが定義されていますが、このうち重要なのは以下の5つのメソッドです。
11のインターフェースメソッドの内、doCommand以外の10のメソッドについて、プログラマが自分で定義しなくても良いように基本的な実装を提供してくれるのが、jp.wda.gpss.GeneralSockletクラスです。また、GeneralSockletではinit(SockletDeployInfo, List, Progress)メソッドはfinal宣言されていますので、継承クラスではこのメソッドをオーバーライドすることは出来ません。代わりにinit() / init(List) の両メソッドがGeneralSockletクラスでは提供されます。
 つまり、「GeneralSockletクラスを継承してSockletを作成する」と言う作業は、GeneralSockletで実装されていないdoCommandメソッドを実装し、必要であれば初期化メソッドinit() / init(List)や破棄メソッドdestroy()などをオーバーライドすることを意味します。
 ではまず、HelloWorldクラスで実装されている3つのメソッドについてみてみましょう。
■checkConnection(SocketProcessor client)
 このメソッドは、クライアントがサーバに接続し接続初期コマンドを発行した後、サーバによってこのSockletにそのクライアントが配属された時、一番初めに一度だけ呼ばれるメソッドとなります(呼び出されるシーケンスは、アーキテクチャガイドをご覧ください。)。よってこのメソッド中では、クライアントの初期化やクライアントが適切に接続しているかの検査などを行なうことが出来ます。jp.wda.gpss.SocketProcessorオブジェクトは、クライアントからの接続ソケットを処理するためのオブジェクトです。つまり、クライアントそのものを表現していると言っても良いでしょう。と言うことは、このメソッドの一番目の引数SocketProcessor clientは、現在このSockletに所属しようとしているクライアントを意味しているのです。
 このクライアントにのみメッセージを送信したい場合は、SocketProcessor#send(Strint)APIメソッドを使用します。HelloWorld Sockletでは、8行目でこのAPIメソッドを使用し、クライアントに「Hello! World.」と言うメッセージを送信しています。その他のSocketProcessorインターフェースのAPIメソッドについては、第3章で詳しく説明します。
 また、現在接続中のすべてのクライアント達にメッセージを送りたい場合は、GeneralSockletクラスのAPIメソッドを使用しますが、これについては第2章で詳しく説明することにします。
 このメソッドの戻り値は、「クライアントが適切であるか」を意味する真偽値です。クライアントが適切であり、この後も接続を継続していく場合は真を、直ちに接続を終了させたい場合は偽を返してください。HelloWorld Sockletでは、これより後も接続を継続するので、真を返しています。
 偽を返した場合でも、このメソッド中で送信されたメッセージは、確実にクライアントに送信されることが保障されています。
■preRemoveClient(SocketProcessor client)
 このメソッドは、クライアントの接続が終了する間際に、一度だけ呼ばれるメソッドです。このクライアントの接続終了を、接続中のほかのクライアントに通知する場合などに使用します。引数は、今現在接続を終了しようとしているクライアントを表しています。このメソッド中では、すでにクライアントのソケットは終了している可能性がありますので、引数のクライアントにメッセージを送信することは出来ません。
 HalloWorld Sockletでは、接続中の全クライアントに、クライアントが一人抜けたことを通知しています。
■doCommand(SocketProcessor client, String command)
 GeneralSocklet継承クラスで必ず実装しなければいけない唯一の、最も重要なメソッドがこのdoCommand()メソッドです。
 このメソッドは、クライアントから送信されてきたコマンド文字列を解釈し、処理するためのメソッドです。クライアントからは、XMLコマンドが送られてくるかもしれませんし、":"区切りのコマンドが送られてくるかもしれません。その内容について、Sockletサーバは全く拘束しません。送られてくるコマンドについてのプロトコルは、Socklet制作者が自由に設定し、それを処理するメソッドを記述してください。HelloWorld Socklet18行目では、コマンドについての解釈は一切行なわず、GeneralSocklet#sendToAllClientメソッドを使用して、送られてきたコマンドをそのままに、すべてのクライアントに対して送信しています。
 このメソッドの戻り値は、checkConnectionメソッドと同様、「送られてきたコマンドが適切であるか」を意味する真偽値です。偽を返すと直ちにそのクライアントの接続を終了させますが、checkConnectionメソッドと同様、メッセージの送信は保障されています。
Sockletをサーバに配備する
 では、HelloWorldクラスをコンパイルし、サーバに配備しましょう。  まずは完成したクラスを、GPSSホームにあるclassesディレクトリに置くか、 またはstartup.batを編集して、Sockletを置くディレクトリまたはJarファイルをGPSS_CP環境変数に追加してください。  次に、GPSSホームにある「config.xml」を編集します。リスト1.2の様に、config.xmlに追加してください。

リスト1.2
<socklet name="helloworld" class="jp.wda.gpss.samples.chap1.HelloWorld" />

これで、「helloworld」と言う配備名で、HelloWorld Sockletクラスがサーバに配備されます。
 早速サーバを起動し、GPSSに付属しているtestClient.swfを実行してみましょう。Initに「helloworld」と入力し、Server、Portはデフォルトのままでconnectボタンをクリックしてください。「ServerMessage」テキストフィールドに、
 Hello! World.
と表示されましたか?
 無事表示されたら、今度はtestClient.swfを複数実行し、コマンドを送信してみてください。doCommandで記述してある「送られてきたコマンドをそのままに、すべてのクライアントに対して送信する」ことの意味が分かると思います。
 config.xmlの詳しい設定方法については、「初期設定ファイルの仕様」をご覧ください。