トップページ⇒tech
27コメント12KB

Javaチャット

■ このスレッドは過去ログ倉庫に格納されています
0001魁!名無しさん NGNG
Javaチャットを勉強して簡単なマルチユーザゲームみたいな
ものを作ってみたいのですが、Javaチャットはサーバを立てないと
無理なのでしょうか?
CGIと通信させると負荷が大きくなりそうですし・・・。
詳しい方、教えてください。
0002平八 NGNG
心が通じればサーバなどなくとも
0003名無しさん@お腹いっぱい。 NGNG
念話で話せ
0004名無しさん@お腹いっぱい。 NGNG
いや、電波で。
0005名無しさん@お腹いっぱい。 NGNG
無理じゃない?
だってクライアント同士で通信しようとしても Applet だと
セキュリティーチェックが掛かって普通は出来ないからな。
0006名無しさん@お腹いっぱい。 NGNG
愛があれば通じるさ。
0007名無しさん@お腹いっぱい。 NGNG
>>5
http://irc.2ch.net/

これをどうやって処理してるかわかりまちゅか?
CSの基本でちゅよー。
0008>7 NGNG
アプレットからIRCサーバに繋いでいるんでしょうか。
どうやっているのかなぁ。
0009名無しさん@お腹いっぱい。 NGNG
>7
1はサーバを立てずにAppletで通信したいとかいってるから、
クライアント同士でAppletでは通信できないってこたえてるんじゃない?

0010プロ NGNG
結論:無理。
0011名無しさん@お腹いっぱい。 NGNG
>8
Applet <--&gt; irc.2ch.net <--&gt; IRC
0012名無しさん@お腹いっぱい。 NGNG
普通は
Applet <-HTTPで通信-> CGI
でやるんだよ。
0013名無しさん@お腹いっぱい。 NGNG
レンタルサーバー借りろ。
0014名無しさん@お腹いっぱい。 NGNG
マルチユーザゲームにしたい&サーバマシン環境が自由になるなら
Applet<-TCP/UDPSocket->サーバ
Applet<-RMI->RMIサーバ
Applet<-CORBA・IIOP->ORBサーバ
のどれかがいいと思う。
リアルタイム性が欲しいならUDPSocketが良さそう。
開発が一番楽なのはRMIだろけど。
受付窓口がRMIで、ゲーム中はSocketと言うハイブリッドが良いかな。
0015名無しさん@お腹いっぱい。 NGNG
Applet <-HTTPで通信-> CGI (irc.2ch.net) <--&gt; IRC
ということ?>>12
00161 NGNG
有り難うございます。
やっぱりサーバを立てないと無理なんですね。
RMIやCORBAなどについては解らないので勉強します。
0017名無しさん@お腹いっぱい。 NGNG
それってAppletのセキュリティチェックはどうなってんの?>Applet<-TCP/UDPSocket->サーバ
0018名無しさん@お腹いっぱい。 NGNG
>17
Appletアップロードしてるマシンにサーバ立てるしかないか。
それが出来ないならあきらめてアプリケーションで作りましょう。
セキュリティ弄るのはわけわかめ。
0019名無しさん@お腹いっぱい。 NGNG
結局セキュリティ甘いIEのMS独自規格Javaでしかできないってこと?
0020名無しさん@お腹いっぱい。 NGNG
>19
Appletの制約は、Appletがアップロードされているサーバマシンの
以外のストレージには基本的にアクセス不能ってことです。
(IEも寝助もVMがバグってて、いまだにいろいろ穴があるらしいけど)
でも、そのサーバマシンのストレージには、普通に読み書きできるっす。
但しネット越しになるわけだけど。
0021名無しさん@お腹いっぱい。 NGNG
でー具体的にはどうやればいいの?
0022名無しさん@お腹いっぱい。 NGNG
>21
データ永続化は全部サーバのストレージにしろってこと。
0023名無しさん@お腹いっぱい。 NGNG
「チャットテレクラへようこそ」の巻(1/2)

■JavaアプリケーションとJavaアプレットの違いをまず知らないとダメ
JavaアプリとJavaアプレットはアプリケーションの配布方法が違います。

Javaアプリケーションの配布方法は,普通にPCにインストールして使うアプリ
と同じ。Javaアプレットの配布方法は,ネットワークからプログラムコードを
ダウンロードすることで行われます。
#一般に「アプレット」というのは,親アプリケーションに組み込んで使う
#小さなプログラムことです。アプレットはJavaに特化した用語じゃない。

■Javaアプレットに制限が設けられるのはなぜ?
アプレットの配布元が信頼できるのかできないのか分からないから。

Javaアプリは利用者がインストール作業を自前でするけど,アプレットは
半自動的にインストールと実行がされしまう。すると利用者が知らず知らず
のうちに,アプレットを実行してしまうということがありうる。

配布元の身元が不明で,しかも利用者の同意を得ているのか分からないような
プログラムがローカルなファイルにアクセスできたり,
他のホストコンピュータと通信できたりすると,とっても危険。

だからアプレットには,「ネットワークで通信できるのはダウンロード元
のホストのみ」とか「クライアントのファイルにはアクセスできない」
という制限があるわけです。

ただイントラネットでアプレットを使うというときは,配布元の素性
が完全に分かっているので,アプレットの動作制限を撤廃できます。

やや喩えが下品かもしれないが,初対面の人とは濃厚なエッチはしないもん
でしょう。普通,付けるものを付けるでしょう?
相手が何者か分からないのに遊びほうけてたら,病気になっちゃうからね。

つづく
0024名無しさん@お腹いっぱい。 NGNG
「チャットテレクラへようこそ」の巻(2/2)

■Javaでチャットシステムを作るには?
まずシステムの仕様をよく考えてみること。

アプリケーションの配布方法によって若干構成が違うけど,
共通していることはサーバホストが必要だということ。

なぜならサーバが現在のチャット参加者を取りまとめなければ
ならないからです。
サーバに必要な機能の一つめは,チャット参加者の名簿を管理することです。

クライアントで使うソフトがJavaアプリケーションのときは,
サーバに必要な機能はこれ(名簿の管理)だけでも一応チャットシステム
になります。

ここでまたまた下品な喩え話しをすると,
チャットというのはテレクラのシステムそのもの。
#だから「チャット作りたい」なんて言ってる人は恥ずかしいのよ。

S婆がサーバ,A子がクライアントだとすると両者のやり取りはこんな感じ。

A子→S婆「もしもしぃー」
S婆→A子「はい,チャットテレクラ」

A子→S婆「登録お願いします」
S婆→A子「アンタの名前は?」

A子→S婆「[email protected]です」
S婆→A子「はい,分かったよ」

A子→S婆「いまだれいますか?」
S婆→A子「KENとJUNがいるよ」

A子→S婆「JUNさんお願いします。JUNさんのアドレス教えてください」
S婆→A子「192.168.0.2だよ」

A子→S婆「分かりました。」
S婆→A子「はい,それじゃーね」

――サーバとの接続を切断――

A子→JUN「いまヒマ?」
JUN→A子「オレ?いまヒマだよ」

Javaアプリケーションではホスト間が直接通信できるので,
こんな粗筋でよさそうです。
しかしクライアントがJavaアプレットの場合,通信できるホストは
サーバホストだけなので,サーバは各クライアントからのメッセージ
を中継しないといけません。
よってサーバに必要な機能のふたつめは,メッセージを中継すること。

A子の例をもう一度使うと,会話できる相手はS婆を通して行われるんだから
JUNとA子のチャットはこんな感じになります。

A子→S婆「いまヒマしてます」
S婆→JUN「A子が「いまヒマしてます」って言ってる」
JUN→S婆「オレもいまヒマしてるよ」
S婆→A子「JUNが「オレもいまヒマしてるよ」って言ってる」

ややヘンな感じがするけどチャットになってるでしょう。
#余談だがCGIチャットは,大勢で一つの黒板を使って筆談しているような
#感覚に近い。

いま挙げた例は,2者間のチャットだったけど
人数が増えたときはどうすればいいか,だいたい想像が付くはず。

まず実装以前に,どんなシステムにしたいのか(何が必要なのか,
どんなことができて,どんなことができないのか)をよく考えてみると
良いでしょうね。大事なことはシステムの核となる概念。
実装なんてものは,オンラインヘルプを読めばだれにでもできます。

それじゃ面白いものができたら教えてね。
この書き込み,役に立たなかったらごめんね。
0025名無しさん@お腹いっぱい。 NGNG
RMIかCORBAで、クライアントから、リロード時と書き込み時に
サーバのメソッド(サーバにあるチャットログファイルを
読み込みする関数&書き込みする関数)呼ぶのが簡単だよ。

サーバー側は2メソッド持ってるサーバプロセス&ネーミング
サーバプロセス。

クライアント側は、チャットログファイルの内容パースして
画面表示する機能と、送信時に送信内容整理する機能くらい
あれば(Appletにしてサーバプロセスがあるマシンにアップ
しとけば、そのページをWebブラウザで見にいけば、アプリ配布
しなくても、誰でもチャット入室可能)いけるよね?
0026名無しさん@お腹いっぱい。 NGNG
リロード時と書き込み時ではリアルタイム性に問題がないですか?>>25
CGI型のように遅延バリバリにならん?
IRCみたいにしないといかんのではないか?
0027名無しさん@お腹いっぱい。 NGNG
じゃあリロード関数は、誰かが書き込むまでスリープして、
書き込みがあった瞬間に書き込み分だけをサーバから返して
死ぬスレッド作って、クライアントに戻り値で返して、戻って
きた瞬間にまたリロード関数コール。

CGIみたいに、静的にリロード時間決めるんじゃなくて、
「サーバに書き込みがあったらリロード」になれば、
遅延は気にしないですむかな?
■ このスレッドは過去ログ倉庫に格納されています