2012年11月18日
ネットワーク対戦型ゲームその4-2
次にクライアント側の
ClientThreadです
こうしてソースを見てみるとサーバのマルチスレッドがない分短いですね笑
この程度の動作ではTCPとUDPの速度差は感じることはないと思いますが、
ゲームを作るとなるとかなり違ってくるんじゃないでしょうか?
ちなみに現在制作中のゲームはUDPでの通信に変更しました(^^;)
やはりマルチキャストの存在は大きいですねw
ひとまずこれで通信関係は終わりにしようと思います。
気が向けばAndroidのUDP通信にも触れようかな〜ぐらいですw
次回からは個人的に苦労した
Javaでネットワーク対戦型2Dアクションゲーム
の、描画関係について書いていきたいと思います。
やっぱりJavaでゲームってのは探してもなかなか見つからないですし、
あってもアクションゲーム向きなのはほとんどないのが現状な気が・・・
(もし解説されてる方がおられましたらすいません!)
ClientThreadです
import java.net.*;
import java.io.*;
//サーバと通信するクラス
public class ClientThread extends Thread{
//サーバのIPアドレスまたは同一LAN内ならばホスト名
private final static String IP = "localhost";
//サーバのポート番号
private final static int PORT = 50000;
//MainPanelのオブジェクト
public MainPanel panel;
//サーバのIPとポート番号を指定するオブジェクト
InetSocketAddress address;
//マルチキャスト受信用アドレス
private final static String castIP = "224.1.1.1";
//マルチキャスト用ソケット
private static MulticastSocket socket;
private static InetAddress inetAddress;
public ClientThread(MainPanel panel){
this.panel = panel;
try{
//受信用にマルチキャストのポート番号を引数としてソケットを作成する
socket = new MulticastSocket(PORT);
//マルチキャストのアドレスからInetAddressオブジェクトを生成する
//これはInetSocketAddressと違い、アドレス情報のみしか表わさない
inetAddress = InetAddress.getByName(castIP);
//先ほど作成したソケットをマルチキャストのグループに追加する
//これによりマルチキャストを受信できるようになる
socket.joinGroup(inetAddress);
//サーバと1対1で通信するために
//サーバのIPとポートからInetSocketAddressオブジェクトを生成する
//サーバはマルチキャストと同じポート番号で
//普通の受信も行っているので上記のソケットと同じ値を引数にしていする
//もちろんプログラムを変更して、マルチキャストと別のポートをしようすることも可能であるが
//ポート番号は有限なので無駄遣いは避けたい
address = new InetSocketAddress(IP, PORT);
}catch (IOException e){
e.printStackTrace();
}
}
//スレッド処理
public void run(){
int size;
String str;
byte[] buf = new byte[1024];
try {
//受信ループ
while (true) {
//データの受信
//受信用のパケットを作成
DatagramPacket recvPacket = new DatagramPacket(buf, 1024);
//受信待ち、ここで停止
socket.receive(recvPacket);
//受信したバイトデータを文字列に変換
str = new String(recvPacket.getData(), 0, recvPacket.getLength());
//Integer.parseInt(文字列)で文字列をint型へ変換
int clientNumber = Integer.parseInt(str.substring(0, str.indexOf(':')));
//クライアントと接続できた時に もっとも大きなクライアントナンバー+1が今接続している数なので
//MainPanelのclientNumへ反映する
if(panel.clientNum < clientNumber+1){
panel.clientNum = clientNumber+1;
}
//サーバから送られてきた各クライアントの座標をMainPanelのx, y配列にセットする
panel.x[clientNumber] = Integer.parseInt(str.substring(str.indexOf(':')+1, str.indexOf(',')));
panel.y[clientNumber] = Integer.parseInt(str.substring(str.indexOf(',')+1, str.indexOf('E')));
//そして再描画する
panel.paintScreen();
}
} catch (Exception e) {
e.printStackTrace();
disconnect();
}
}
//送信
//詳しくはサーバを参照
public void send(String message){
byte[] b = message.getBytes();
try {
if(socket != null){
DatagramPacket sendPacket = new DatagramPacket(b, 0, b.length, address);
socket.send(sendPacket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
//切断
public void disconnect() {
try {
socket.close();
socket=null;
} catch (Exception e) {
e.printStackTrace();
}
}
}
こうしてソースを見てみるとサーバのマルチスレッドがない分短いですね笑
この程度の動作ではTCPとUDPの速度差は感じることはないと思いますが、
ゲームを作るとなるとかなり違ってくるんじゃないでしょうか?
ちなみに現在制作中のゲームはUDPでの通信に変更しました(^^;)
やはりマルチキャストの存在は大きいですねw
ひとまずこれで通信関係は終わりにしようと思います。
気が向けばAndroidのUDP通信にも触れようかな〜ぐらいですw
次回からは個人的に苦労した
Javaでネットワーク対戦型2Dアクションゲーム
の、描画関係について書いていきたいと思います。
やっぱりJavaでゲームってのは探してもなかなか見つからないですし、
あってもアクションゲーム向きなのはほとんどないのが現状な気が・・・
(もし解説されてる方がおられましたらすいません!)
【ゲームプログラミングの最新記事】
投稿者:Sert|00:54|ゲームプログラミング
この記事へのコメント