2012年10月15日
ネットワーク対戦型ゲームその2
お久しぶりです^^
AndroidでのUDP hole punchingについて書く前に
TCP、UDPについてもう少し詳しく書いていこうかと思います。
TCPもUDPも通信にはソケットというものを使用します。
ソケットとはIPアドレスとポート番号をひとまとめにしたものだと言えます。
ポート番号を使用する利点としては、同一IPアドレスでもポート番号を変えることで
同時に複数の通信を行うことができることです。
例えば、もしIPアドレスのみであれば
ブラウザでネットに接続している間はSkypeは使えない、と言った問題が発生するのです。
それ故にTCPでもUDPでもソケットを使用しないと通信がおこなえないのです。
それではTCP、UDPの通信方法を見ていきましょうか。
TCPではまず、受信側(サーバ)が受信を監視するポート番号を指定して待機します。
ここでは10000番にしておきましょう。
Javaでは次の用に書きます。
ServerSocket server = new ServerSocket(10000);
これでサーバを作成し、
Socket S_socket = server.accept();
これで監視をして待機します。
サーバとクライアントのプログラムは別々に書きます。
送信側(クライアント)はサーバのIPアドレスとポート番号を指定して接続します。
Socket C_socket = new Socket(サーバのIPアドレス , 10000);
これでserver.accept()関数によってサーバと接続することができます。
接続するだけであればこれで完了です。
接続している間はサーバ側のS_socketとクライアント側のC_socketは繋がっている状態と言えます。
相手からデータを受信する場合はInputStreamを使用します。
InputStream in = S_socket.getInputStream();(サーバからクライアントへ送信の場合)
InputStream in = C_socket.getInputStream();(クライアントからサーバへ送信の場合)
どちらの場合でも
byte[] rb = new byte[10240];
int size = in.read(rb);
String receive = new String(rb, 0, size, "UTF-8");
これでOKです。
受信データはbyte型なので受信用にbyte配列を作成します。
次にin.read(rb);で受信待ちをします。
データを受信した場合はbyte配列rbにデータを格納して、その大きさをsizeに代入します。
そしてbyteデータをString型に変換します。
Stringのコンストラクタは(byte配列 , 変換開始位置指定 , 変換する文字数指定 , 文字コード);
となります。
なのでここではbyte配列の最初からsizeの数だけ文字をUTF-8でString型に変換する、となります。
相手にデータを送信する場合はOutputStreamを使います。
OutputStream out = S_socket.getOutputStream();(もしくはC_socket.getOutputStream();)
byte[] sb = "送信したい文字列".getBytes("UTF8");
out.write(sb);
送信したい文字列をbyte配列に格納したあと、out.write(sb);で書き込みます。
これを受信側がin.read(rb);によって読み取るのです。
これだけで簡単な文字列のやり取りができます。
これをマルチスレッドで処理することで繰り返しやり取りすることができます。
すなわちチャットプログラムになるのです。
文章で説明するのは苦手なので図も載せておきます笑
かなり自己解釈が多いので詳しく知りたい方は検索して調べてみることをお勧めします(^_^;)
次回はUDPについて書いてみます。
AndroidでのUDP hole punchingについて書く前に
TCP、UDPについてもう少し詳しく書いていこうかと思います。
TCPもUDPも通信にはソケットというものを使用します。
ソケットとはIPアドレスとポート番号をひとまとめにしたものだと言えます。
ポート番号を使用する利点としては、同一IPアドレスでもポート番号を変えることで
同時に複数の通信を行うことができることです。
例えば、もしIPアドレスのみであれば
ブラウザでネットに接続している間はSkypeは使えない、と言った問題が発生するのです。
それ故にTCPでもUDPでもソケットを使用しないと通信がおこなえないのです。
それではTCP、UDPの通信方法を見ていきましょうか。
TCPではまず、受信側(サーバ)が受信を監視するポート番号を指定して待機します。
ここでは10000番にしておきましょう。
Javaでは次の用に書きます。
ServerSocket server = new ServerSocket(10000);
これでサーバを作成し、
Socket S_socket = server.accept();
これで監視をして待機します。
サーバとクライアントのプログラムは別々に書きます。
送信側(クライアント)はサーバのIPアドレスとポート番号を指定して接続します。
Socket C_socket = new Socket(サーバのIPアドレス , 10000);
これでserver.accept()関数によってサーバと接続することができます。
接続するだけであればこれで完了です。
接続している間はサーバ側のS_socketとクライアント側のC_socketは繋がっている状態と言えます。
相手からデータを受信する場合はInputStreamを使用します。
InputStream in = S_socket.getInputStream();(サーバからクライアントへ送信の場合)
InputStream in = C_socket.getInputStream();(クライアントからサーバへ送信の場合)
どちらの場合でも
byte[] rb = new byte[10240];
int size = in.read(rb);
String receive = new String(rb, 0, size, "UTF-8");
これでOKです。
受信データはbyte型なので受信用にbyte配列を作成します。
次にin.read(rb);で受信待ちをします。
データを受信した場合はbyte配列rbにデータを格納して、その大きさをsizeに代入します。
そしてbyteデータをString型に変換します。
Stringのコンストラクタは(byte配列 , 変換開始位置指定 , 変換する文字数指定 , 文字コード);
となります。
なのでここではbyte配列の最初からsizeの数だけ文字をUTF-8でString型に変換する、となります。
相手にデータを送信する場合はOutputStreamを使います。
OutputStream out = S_socket.getOutputStream();(もしくはC_socket.getOutputStream();)
byte[] sb = "送信したい文字列".getBytes("UTF8");
out.write(sb);
送信したい文字列をbyte配列に格納したあと、out.write(sb);で書き込みます。
これを受信側がin.read(rb);によって読み取るのです。
これだけで簡単な文字列のやり取りができます。
これをマルチスレッドで処理することで繰り返しやり取りすることができます。
すなわちチャットプログラムになるのです。
文章で説明するのは苦手なので図も載せておきます笑
かなり自己解釈が多いので詳しく知りたい方は検索して調べてみることをお勧めします(^_^;)
次回はUDPについて書いてみます。
【ゲームプログラミングの最新記事】
投稿者:Sert|00:35|ゲームプログラミング
この記事へのコメント