Search on the blog

2011年9月10日土曜日

Javaで簡易チャットを作る

Javaのソケット通信で遊んでみた。
以前Cでソケット通信をやってみたけど、手続きがややこしくて挫折してしまった。

Javaの場合は、Cと比べ簡単にソケット通信ができる。
ということで、簡易チャットを作って遊んでみた。

ソケットの読み/書きを、SocketReader、SocketWriterというクラスで実装した。チャットの読み/書きは非同期に独立して行われるべきなので、この2つのクラスはスレッドにした。

ソースはこちら
実行ファイルはこちら

ネットワークプログラミングはあまりやったことがなかったけど、とても楽しかった。上のプログラムは、いろいろな応用テーマが考えられる。
  1. ソケットの暗号化 シーザー符号とかでもいいけど、フェルマーの小定理を用いた暗号化がおもしろそう。 具体的には、両者間で素数pとべき数pwを決めておく。送信者側で、f : x -> x^pw (mod p)の変換をしてデータを送り、受信者側では、f : x -> x^(p-pw) (mod p)でデータを復元する。あとは、RSAとかを自分で実装してみるとか。(※)
  2. リモートマシンの制御 ソケットでコマンドを送信してあげて、受信側で別プロセスを立ち上げてコマンドを実行する。コマンドの結果をソケットに流すようにすると、別のマシンを制御することができる。これは、自分のサーバーとローカルマシンで試したみたんだけど、いろいろと危ない。
  3. NAT超え 通信を行うコンピュータが両方ともグローバルIPを持っていれば問題なく通信ができるが、そうでない場合は、ルータでポートフォワーディングの設定が必要となる。ポートフォワーディングの設定をしたとしても、ルータ側のIPを知っている必要がある。仲介サーバとかをつかえば出来そうだけど、勉強中。
(※ちょっと勉強したので追記)
RSAは、フェルマーの小定理というよりそれを一般化したオイラーの定理を利用している。上の自分が考えたやり方だと、公開鍵方式にはならない。。
合成数(x = p1 * p2)に対してオイラー関数(totient functionのこと)が、(p1-1) * (p2-1)となるのが嬉しい。p1とp2が分からないと、a^pw = a (mod x)となるpwが分からないってところがポイント。

0 件のコメント:

コメントを投稿