ピュアP2Pもどきチャット できたよー\(^o^)/

[id:codnote:20080420:1240191154]で遊びのつもりだったのに完成してしまった。
ちなみに完全自力でスクラッチ。まずはソースをば。

ソース


保存は右にある「view raw」を右クリック>保存でOK.

ライセンス

ライセンスはいつも通りCreative commons
Creative Commons License
この作品は、クリエイティブ・コモンズ・ライセンスの下でライセンスされています。
クレジット:Sora Harakami(http://d.hatena.ne.jp/codnote
変更して公開したりした場合はコメント欄に書くかメールをください!!(できれば)

おことわり

なんか一つのノード(接続してる人)が消えると、
そのノードにつないでる人が送信できなくなるという変なことが起こります。現在絶賛修正中ですので、修正したらまたここにかきます。

準備

ターミナルの文字コードUTF-8にして、
初期ノード用ファイルを準備します。

initseed_ポート番号.txt

これ重要です。ちなみに標準だとid:qnighyの例にそって18782(イヤな奴)です。
ファイルに書き込む形式は

アドレスまたはIPアドレス:ポート番号

です。複数指定できます。改行区切りです。
ファイルがないとエラーがでて終了します。

準備その2〜ローカルでテストする方法〜

initseedのファイルを複数用意します。すべてポート番号はずらしてください。
20000とか20001とか20002とかで。
あとどれか一つのポート用ファイルは空のファイルで。

起動してみる

$ ruby rubyp2p.rb ポート番号 nick

これおkです。nickにはニックネーム。チャットで使うものを。
んで、まずは初期ノード(ファイルを空にしたポートの奴か、ファイルを空にした人)を起動します。

info>My port is 20004
info> My initseed is:[]
info> Server started....
info>Join to P2P Network...
info>P2P Network joined

これで準備はおk。後の2つを起動します。

info>My port is 20003
info> My initseed is:[["127.0.0.1", 20004]]
info> Server started....
info>Join to P2P Network...
info>Connecting to 127.0.0.1:20004 ....
info>Waiting for "reg_ok" ....
info>Loop count: 0
info>127.0.0.1:20004 is registed
info>P2P Network joined
info>My port is 20018
info> My initseed is:[["127.0.0.1", 20004]]
info> Server started....
info>Join to P2P Network...
info>Connecting to 127.0.0.1:20004 ....
info>Waiting for "reg_ok" ....
info>Loop count: 0
info>127.0.0.1:20004 is registed
info>P2P Network joined

2つを起動すると、初期ノードの画面では・・・

info>My port is 20004
info> My initseed is:[]
info> Server started....
info>Join to P2P Network...
info>P2P Network joined
info>localhost(127.0.0.1) is accepted
info>localhost(127.0.0.1):20003 is registed
info>localhost(127.0.0.1) is accepted
info>localhost(127.0.0.1):20018 is registed

うまく認識されてますね
では入力してenterしてみましょう

こんにちはこんにちは!
hage: こんにちはこんにちは!

ほかのノードでもおなじものがでているはずです。
では別のノードでも打ってみます。
まあご想像通りなんですが

hage: こんにちはこんにちは!
hoge: これがP2Pなんですね、わかりま(ry
bage: うはwwww
bage: でもbなんか左カーソルキーがうまくうごかなくね?
hoge: マジだ
hage: ほんとだ
hoge: 勝手に終了してみる
info>localhost(127.0.0.1) is gone
hage-hoge-bage
hage-(いない)-bage

こんな感じで接続されているので、hogeが終了したせいで通じなくなりました。
だから複数ノードを指定しておくと幸せ?
まあこんなもんです。ソースも汚いしなあ・・・。
id:rosylillyrubyっぽくないとか言っていた。