演習3-2 ネットワーク対戦ゲームクライアント
をテンプレートにして作成
開始行:
[[TopPage]] > [[演習課題]] > 演習3-2 ネットワーク対戦ゲー...
* ネットワーク対戦ゲームクライアントの作成 [#rc5dd636]
まず,下記のプログラムと画像3枚を同じフォルダにダウンロ...
&ref(MyClient.java,,,MyClient.java ダウンロード);/[[ソー...
画像ファイルの保存は,画像ファイル上で右クリックし&color(...
★保存先のフォルダが変わっている場合がありますので,注意し...
&ref(White.jpg); ... White.jpg~
&ref(Black.jpg); ... Black.jpg~
&ref(GreenFrame.jpg); ... GreenFrame.jpg~
&size(18){※この課題では,演習3-1-1の練習問題で作成した&co...
#br
** プログラムの実行 [#lf76b5e0]
接続を確認するために,コマンドプロンプトを3つ起動させま...
- 一つのコマンドプロンプトで,MyServer2.javaを起動させま...
- あとの二つのコマンドプロンプトで,MyClient.javaを起動さ...
- MyClientに表示されたコマを動かしてください.もう一方の...
-- 動かない場合は,MyServer2.javaのコンパイルからやり直し...
#ref(multimove.png,nolink,center)~
CENTER:図1. 2つのMyClient.java
** プログラム(MyClient.java)の解説 [#a545d56e]
MyClient.javaは大きく4つの部分に分かれています.
+ MyClient~
ここは,MyClient()が起動したときに,最初に動く(実際はmai...
-- 名前の入力ダイアログの表示
-- メインのウィンドウの表示
-- サーバへの接続~
を行います.
+ MesgRecvThread~
MyClient.javaでいつも動いている(監視している)ところは,...
具体的には「public void run()」が,プログラムの起動中ずー...
+ main~
起動時には,ここの関数が呼ばれますが,実際には,すぐに,M...
+ マウスイベント部(mouseClicked,mouseEntered,mouseExit...
マウスでオブジェクトに何かしたときに,発生します.
このマウスの処理に応じたプログラムを書くことで,何かでき...
上記のプログラムでは,mouseDraggedとmouseClickedに処理を...
** プログラムの改良 [#haf84ef4]
プログラムの改良を通じて,動きを理解しましょう.''しっか...
*** 改良1 - 複数のPC間で通信できるようにしましょう. [...
いずれ複数のPCを使ってテストするためにも,%%%先にやってお...
-- 名前の入力ダイアログのあとに,%%%「サーバのIPアドレ...
-- IPアドレスが空の場合には,%%%''"localhost"''(自分のP...
--- "localhost"は,IPアドレス127.0.0.1(自分のPC)を表...
--- 自分のPCへのアクセスという操作はよくあるため,覚え...
-- この方法ではPCが最低2台必要になります.1台はサーバ...
&br;
PCのIPアドレスの調べ方は,IPアドレスを調べる方法を見てく...
&br;
複数のPC間で通信テストをやりたい場合,[[Q&A>Q&A#bf9...
&color(,yellow){ヒント};:
- 名前ダイアログを出すプログラムが,MyClientのどこかにあ...
-- それを参考にIPアドレスダイアログを出すようにしましょう.
- %%%入力で得られた変数をどこで用いるか%%%,についても考...
-- "localhost"にしか接続できない状況を変更して,入力内容...
- 通信できるかどうかのチェックはIPアドレスを調べる方法や[...
&color(,yellow){ポート番号とは};:
- ポート番号とは,TCP/IPを用いた通信において,プログラム...
- 同じ番号同士で通信をします.
- 今回のサンプルでは,10000番をしています.0番〜65535番ま...
&color(,yellow){失敗例(MyServer2が起動しない!)};:
- 「ソケットへの接続エラー」のようなエラーメッセージがで...
- 「ソケット」というのは,インターネット(TCP/IP)の考え...
- エラーの原因ですが,「MyServer2」が2つ立ち上がっていま...
- 「MyServer」と「MyServer2」が2つ立ち上がっていませんか?
- MyServer2は,サーバーです.特定のポート(このプログラム...
- すでに先に一つのMyServer2が立ち上がっていると,もう一つ...
&br;
*** 改良2 - 特定の番号のコマは動かないようにしてみましょ...
例えば,配列の1番目だけは,動かないようにしてみましょう...
&br;&br;
&color(,yellow){ヒント1};:
- theArrayIndexは文字列なので,比較する時は注意してくださ...
&color(,yellow){ヒント2};:
- 配列の0番目は動かない=配列の0番目以外は動く とかけば...
&color(,yellow){ヒント3};:下記のプログラムは,0以外の場...
注意:このコードをMyClient.javaに書き加えるわけではないで...
if(x != 0){
x = x + 1;
}
&br;&br;
*** 改良3 - 自動的に,黒と白を決めてみましょう. [#w37c0...
MyServer2では,演習3-1-1の練習問題(MyServer2.java)では,...
1
と接続番号を送信していますね.~
この接続番号「1」(2回目は2,3回目は3...)の数字を...
#br
MyClientの受信部分は
public void run()
です.そこで,
out.println(myName);//名前を送る
の後に,
String myNumberStr = br.readLine();
を追加します.
これで,サーバが送った番号を受け取れますが,このままだと...
Integer.parseIntを使って数値にします.
&br;
また,この数値を奇数が偶数かを判定するには,
%(モジュロ)演算子を使います.
&br;
例えば,下記は偶数の時にif文の条件を満たします.
if(myNumberInt % 2 == 0){
}
自分が黒か白かの情報は,他の場所でも使いますので,どこで...
public class MyClient extends JFrame implements MouseLis...
private JButton buttonArray[];
のようなところに,
private int myColor;
と宣言しておいて,
-myNumberIntが偶数のときはmyColorを0(黒)にする
-myNumberIntが奇数のときはmyColorを1(白)にする
などと決めておくと良いでしょう.
&br;
これで,プログラム中のどこでも自分の色を参照できるように...
試しに,コマをクリックしたら,myColorの色に変えるよう修正...
&br;
&color(,yellow){もう少し改良!};:これまでの改良では,特...
コマをクリックしたら,myColorの色に変えるよう修正してくだ...
この修正は,
public void mouseClicked(MouseEvent e)
の中を修正します.
最初のmouseClickedのプログラムは,白がおかれていたら,黒...
それ以外が置かれていたら,白にするプログラムです.
そのプログラムを,白の人は白だけ,黒の人は黒だけおけるよ...
先ほど作成した,myColorを使って,if文を書いてみましょう.
修正ができたら,実行してみて,~
一方のMyClientは黒だけしかおけないことを~
一方のMyClientは白だけしかおけないことを確認してください.~
*** 改良4 - 自分のコマをクリックしたときに,相手のコマも...
現在は,コマをクリックしたら,自分のコマしか色が変わりま...
まず,''(1)mouseClicked''のところで,mouseDraggedの中身を...
mouseDraggedの中身を参考にしてください.~
mouseDraggedの中身をみるとわかるのですが,~
(1)自分自身の設定する~
(2)相手(サーバ経由で相手に)にその情報を送る~
という流れです.~
mouseDraggedの場合は,移動先の座標を計算して,
その座標を,サーバに送っています.
mouseClickedの場合には,まず,自分のコマを置いて, そのコ...
では実際に書いてみましょう.~
mouseClickedを見ると,すでにひっくり返す部分は書き終わっ...
あとはサーバに送るところを書くだけです.~
ここでは,「MOVE」の代わりに「PLACE」(コマを置く)という...
MOVEでは位置を送信情報としていますが,ここでは自分の色(my...
次に,''(2)MesgRecvThreadのrun()''の中に,if(cmd.equals("...
この中身を参考にしましょう.「PLACE」の命令を受け取った場...
ここに書くのは,%%%情報を送った自分も,受け取った相手も動...
今から書くのは,PLACEなので,コピーしたif文のMOVEをPLACE...
次に,送信したmyColorを受け取る部分が必要です.~
int x = を int theColor = として,myColorをうけとりましょ...
ここで,int myColorとすると,おかしなことになるので,しな...
次に,buttonArrayに送られた色のコマを設定しましょう.~
if文で書くと,色に応じて変更できますね.
&ref(サーバとクライアントの関係_key_pdf__page_1_of_2_.jpg...
図.MyClientからMyServerへの流れ1(プログラム)
&ref(サーバとクライアントの関係_key_pdf__page_2_of_2_.jpg...
図.MyClientからMyServerへの流れ2(プログラムのイメージ)
&color(,yellow){ヒント};:
- 通信相手には"文字列"(msg)の情報しか送れません.
-- したがって,msgに入れられる情報は"文字列"か"数字(の文...
-- "MOVE 2 23 27"という文字列からは,1個の文字列と3個の数...
下記を忘れるとサーバーにデータを送られないので,忘れない...
//サーバに情報を送る
out.println(msg);//送信データをバッファに書き出す
out.flush();//送信データをフラッシュ(ネットワーク上には...
&br;
- (1)の送信部分では,クリックした直後の処理と送信情報の準...
- (2)の受信部分では,送信で受け取った情報を使って,&size(...
以上から,ネットワークを利用したプログラミングでは,書き...
- &color(red){%%%相手の画面にも反映させたい場合%%%→受信部...
- &color(red){%%%自分の画面のみに反映させたい場合%%%→送ら...
とする必要がある,ということですね.詳しい動きは,[[演習4...
&br;
*** 補足 [#pb140054]
MyServer.javaには,接続数の制限があります.つまり接続数が...
maxConnection = 100で制限していますので,気になる人は数を...
※本来なら,socketは使い回せるのですが,プログラムの簡略化...
#br
なお,MyClientの名前は変えても構いませんが,ファイル名を...
ある程度動いたら,名前を変えたり,バックアップをとったり...
※配布しているソースコードに記述してある「マウスが入った」...
-演習2-2 イベント処理を参考にしてみてください.
-全部消してしまう(コメントアウトも)と,&color(red){エラ...
#br
&color(,yellow){バックアップのコツ};:
- ちゃんと動いているプログラムを大きく変更するときには,...
- ただし,Javaは,ファイル名を変更すると,なかのクラス名...
- フォルダ名は日付やファイル名,バージョンなどで区別する...
&size(16){[[&ref(http://yoslab.net/netprog/next.gif,nolin...
終了行:
[[TopPage]] > [[演習課題]] > 演習3-2 ネットワーク対戦ゲー...
* ネットワーク対戦ゲームクライアントの作成 [#rc5dd636]
まず,下記のプログラムと画像3枚を同じフォルダにダウンロ...
&ref(MyClient.java,,,MyClient.java ダウンロード);/[[ソー...
画像ファイルの保存は,画像ファイル上で右クリックし&color(...
★保存先のフォルダが変わっている場合がありますので,注意し...
&ref(White.jpg); ... White.jpg~
&ref(Black.jpg); ... Black.jpg~
&ref(GreenFrame.jpg); ... GreenFrame.jpg~
&size(18){※この課題では,演習3-1-1の練習問題で作成した&co...
#br
** プログラムの実行 [#lf76b5e0]
接続を確認するために,コマンドプロンプトを3つ起動させま...
- 一つのコマンドプロンプトで,MyServer2.javaを起動させま...
- あとの二つのコマンドプロンプトで,MyClient.javaを起動さ...
- MyClientに表示されたコマを動かしてください.もう一方の...
-- 動かない場合は,MyServer2.javaのコンパイルからやり直し...
#ref(multimove.png,nolink,center)~
CENTER:図1. 2つのMyClient.java
** プログラム(MyClient.java)の解説 [#a545d56e]
MyClient.javaは大きく4つの部分に分かれています.
+ MyClient~
ここは,MyClient()が起動したときに,最初に動く(実際はmai...
-- 名前の入力ダイアログの表示
-- メインのウィンドウの表示
-- サーバへの接続~
を行います.
+ MesgRecvThread~
MyClient.javaでいつも動いている(監視している)ところは,...
具体的には「public void run()」が,プログラムの起動中ずー...
+ main~
起動時には,ここの関数が呼ばれますが,実際には,すぐに,M...
+ マウスイベント部(mouseClicked,mouseEntered,mouseExit...
マウスでオブジェクトに何かしたときに,発生します.
このマウスの処理に応じたプログラムを書くことで,何かでき...
上記のプログラムでは,mouseDraggedとmouseClickedに処理を...
** プログラムの改良 [#haf84ef4]
プログラムの改良を通じて,動きを理解しましょう.''しっか...
*** 改良1 - 複数のPC間で通信できるようにしましょう. [...
いずれ複数のPCを使ってテストするためにも,%%%先にやってお...
-- 名前の入力ダイアログのあとに,%%%「サーバのIPアドレ...
-- IPアドレスが空の場合には,%%%''"localhost"''(自分のP...
--- "localhost"は,IPアドレス127.0.0.1(自分のPC)を表...
--- 自分のPCへのアクセスという操作はよくあるため,覚え...
-- この方法ではPCが最低2台必要になります.1台はサーバ...
&br;
PCのIPアドレスの調べ方は,IPアドレスを調べる方法を見てく...
&br;
複数のPC間で通信テストをやりたい場合,[[Q&A>Q&A#bf9...
&color(,yellow){ヒント};:
- 名前ダイアログを出すプログラムが,MyClientのどこかにあ...
-- それを参考にIPアドレスダイアログを出すようにしましょう.
- %%%入力で得られた変数をどこで用いるか%%%,についても考...
-- "localhost"にしか接続できない状況を変更して,入力内容...
- 通信できるかどうかのチェックはIPアドレスを調べる方法や[...
&color(,yellow){ポート番号とは};:
- ポート番号とは,TCP/IPを用いた通信において,プログラム...
- 同じ番号同士で通信をします.
- 今回のサンプルでは,10000番をしています.0番〜65535番ま...
&color(,yellow){失敗例(MyServer2が起動しない!)};:
- 「ソケットへの接続エラー」のようなエラーメッセージがで...
- 「ソケット」というのは,インターネット(TCP/IP)の考え...
- エラーの原因ですが,「MyServer2」が2つ立ち上がっていま...
- 「MyServer」と「MyServer2」が2つ立ち上がっていませんか?
- MyServer2は,サーバーです.特定のポート(このプログラム...
- すでに先に一つのMyServer2が立ち上がっていると,もう一つ...
&br;
*** 改良2 - 特定の番号のコマは動かないようにしてみましょ...
例えば,配列の1番目だけは,動かないようにしてみましょう...
&br;&br;
&color(,yellow){ヒント1};:
- theArrayIndexは文字列なので,比較する時は注意してくださ...
&color(,yellow){ヒント2};:
- 配列の0番目は動かない=配列の0番目以外は動く とかけば...
&color(,yellow){ヒント3};:下記のプログラムは,0以外の場...
注意:このコードをMyClient.javaに書き加えるわけではないで...
if(x != 0){
x = x + 1;
}
&br;&br;
*** 改良3 - 自動的に,黒と白を決めてみましょう. [#w37c0...
MyServer2では,演習3-1-1の練習問題(MyServer2.java)では,...
1
と接続番号を送信していますね.~
この接続番号「1」(2回目は2,3回目は3...)の数字を...
#br
MyClientの受信部分は
public void run()
です.そこで,
out.println(myName);//名前を送る
の後に,
String myNumberStr = br.readLine();
を追加します.
これで,サーバが送った番号を受け取れますが,このままだと...
Integer.parseIntを使って数値にします.
&br;
また,この数値を奇数が偶数かを判定するには,
%(モジュロ)演算子を使います.
&br;
例えば,下記は偶数の時にif文の条件を満たします.
if(myNumberInt % 2 == 0){
}
自分が黒か白かの情報は,他の場所でも使いますので,どこで...
public class MyClient extends JFrame implements MouseLis...
private JButton buttonArray[];
のようなところに,
private int myColor;
と宣言しておいて,
-myNumberIntが偶数のときはmyColorを0(黒)にする
-myNumberIntが奇数のときはmyColorを1(白)にする
などと決めておくと良いでしょう.
&br;
これで,プログラム中のどこでも自分の色を参照できるように...
試しに,コマをクリックしたら,myColorの色に変えるよう修正...
&br;
&color(,yellow){もう少し改良!};:これまでの改良では,特...
コマをクリックしたら,myColorの色に変えるよう修正してくだ...
この修正は,
public void mouseClicked(MouseEvent e)
の中を修正します.
最初のmouseClickedのプログラムは,白がおかれていたら,黒...
それ以外が置かれていたら,白にするプログラムです.
そのプログラムを,白の人は白だけ,黒の人は黒だけおけるよ...
先ほど作成した,myColorを使って,if文を書いてみましょう.
修正ができたら,実行してみて,~
一方のMyClientは黒だけしかおけないことを~
一方のMyClientは白だけしかおけないことを確認してください.~
*** 改良4 - 自分のコマをクリックしたときに,相手のコマも...
現在は,コマをクリックしたら,自分のコマしか色が変わりま...
まず,''(1)mouseClicked''のところで,mouseDraggedの中身を...
mouseDraggedの中身を参考にしてください.~
mouseDraggedの中身をみるとわかるのですが,~
(1)自分自身の設定する~
(2)相手(サーバ経由で相手に)にその情報を送る~
という流れです.~
mouseDraggedの場合は,移動先の座標を計算して,
その座標を,サーバに送っています.
mouseClickedの場合には,まず,自分のコマを置いて, そのコ...
では実際に書いてみましょう.~
mouseClickedを見ると,すでにひっくり返す部分は書き終わっ...
あとはサーバに送るところを書くだけです.~
ここでは,「MOVE」の代わりに「PLACE」(コマを置く)という...
MOVEでは位置を送信情報としていますが,ここでは自分の色(my...
次に,''(2)MesgRecvThreadのrun()''の中に,if(cmd.equals("...
この中身を参考にしましょう.「PLACE」の命令を受け取った場...
ここに書くのは,%%%情報を送った自分も,受け取った相手も動...
今から書くのは,PLACEなので,コピーしたif文のMOVEをPLACE...
次に,送信したmyColorを受け取る部分が必要です.~
int x = を int theColor = として,myColorをうけとりましょ...
ここで,int myColorとすると,おかしなことになるので,しな...
次に,buttonArrayに送られた色のコマを設定しましょう.~
if文で書くと,色に応じて変更できますね.
&ref(サーバとクライアントの関係_key_pdf__page_1_of_2_.jpg...
図.MyClientからMyServerへの流れ1(プログラム)
&ref(サーバとクライアントの関係_key_pdf__page_2_of_2_.jpg...
図.MyClientからMyServerへの流れ2(プログラムのイメージ)
&color(,yellow){ヒント};:
- 通信相手には"文字列"(msg)の情報しか送れません.
-- したがって,msgに入れられる情報は"文字列"か"数字(の文...
-- "MOVE 2 23 27"という文字列からは,1個の文字列と3個の数...
下記を忘れるとサーバーにデータを送られないので,忘れない...
//サーバに情報を送る
out.println(msg);//送信データをバッファに書き出す
out.flush();//送信データをフラッシュ(ネットワーク上には...
&br;
- (1)の送信部分では,クリックした直後の処理と送信情報の準...
- (2)の受信部分では,送信で受け取った情報を使って,&size(...
以上から,ネットワークを利用したプログラミングでは,書き...
- &color(red){%%%相手の画面にも反映させたい場合%%%→受信部...
- &color(red){%%%自分の画面のみに反映させたい場合%%%→送ら...
とする必要がある,ということですね.詳しい動きは,[[演習4...
&br;
*** 補足 [#pb140054]
MyServer.javaには,接続数の制限があります.つまり接続数が...
maxConnection = 100で制限していますので,気になる人は数を...
※本来なら,socketは使い回せるのですが,プログラムの簡略化...
#br
なお,MyClientの名前は変えても構いませんが,ファイル名を...
ある程度動いたら,名前を変えたり,バックアップをとったり...
※配布しているソースコードに記述してある「マウスが入った」...
-演習2-2 イベント処理を参考にしてみてください.
-全部消してしまう(コメントアウトも)と,&color(red){エラ...
#br
&color(,yellow){バックアップのコツ};:
- ちゃんと動いているプログラムを大きく変更するときには,...
- ただし,Javaは,ファイル名を変更すると,なかのクラス名...
- フォルダ名は日付やファイル名,バージョンなどで区別する...
&size(16){[[&ref(http://yoslab.net/netprog/next.gif,nolin...
ページ名: