ソケットなどのネットワークプログラミング、分散オブジェクト (主にCORBA)、リモートプロシージャコール (RPC) などを扱います。
並行、並列、分散はこんな感じでしょうか。
2000.11.19 omniORB 3.0を試す [Java]
2000.11.12 Factoryパターンオブジェクト [Java] [プログラミング]
2000.11.11 HORB-IIOP [Java] [プログラミング]
2000.01.03 CORBAサーバーとクライアントとしてのgtk+アプリケーション [gtk+]
CORBAでのクラス継承を試す。
Counter/ReverseCounterクラスのオブジェクトをやり取りした。Linux版はgtk+(GUI)クライアントも実装してみた。
interface Counter {
readonly attribute short value;
void incr();
void decr();
string name();
};
interface ReverseCounter: Counter {
};
ReverseCounterはincr()で減算し,decr()で加算する。
C++の場合は多重継承を使って実装する。plain Cだと(C++ならコンパイラが自動でやってくれる)vtableを手で書く。Javaは多重継承が使えないので,TIE(委譲)モデルで実装する。
IORを文字列にして渡すというヘボい方法なら,JDK 1.2をサーバーにしたとき以外はどの組み合わせでも問題なく接続できる。
| \クライアント サーバー\ | Linux | Windows | ||||
| omniORB | mico | ORBacus | ORBit | omniORB | JDK 1.2 | |
| omniORB on Linux | ○ | ○ | ○ | (未) | ○ | ○ |
| mico on Linux (注1) | ○ | ○ | ○ | ○ | ○ | ○ |
| ORBacus on Linux | ○ | ○ | ○ | (未) | ○ | ○ |
| ORBit on Linux | (未) | ○ | (未) | ○ | ○ | ○ |
| omniORB on Windows | ○ | ○ | ○ | ○ | ○ | ○ |
| JDK 1.2 on Windows | × (注2) | × (注3) | × (注3) | × (注3) | ○ | ○ |
ネームサービスを介してオブジェクトをやり取りするのは,ORBの組み合わせによって上手くいったりいかなかったりして,2000年1月現在では難しい。
Java専用の分散技術RMI (Remote Method Invocation) のテスト。
CORBAと同様,Linux機(JDK 1.1.6)とWindows機(JDK 1.2)の接続ができない。これがマシンを跨ぐのに失敗してるからか,バージョン間で互換性がないからかは不明。エラーメッセージからは後者のよう。
ソケット非同期通信のテスト。サーバーはLinux,クライアントはWindows, Linux, Java版を用意した。
Java版はスタンドアロン,アプレットのいずれとしても動作し,JDK 1.2 on Windows, JDK 1.1.6 on Linux, Netscape Navigator 4.5 on Windowsで確認した。Internet Explorer 4.0, Netscape Navigator 4.07 on Linuxでは動かなかった。IEで動かなかったのは,かなり謎。
Java版をアプレットとして動かすとき,ユーザー名,サーバーのポート番号を決め打ちしてる(*1)ので,ソースを修正しないといけない。また,Javaアプレットはダウンロード先のホストとしか通信できないので,.classファイルをWebサーバーに置く。
エンコーディングの変換をしてないので,異なるOS間では日本語は通らない。Linux版はEUC-JP, Windows版はShift_JISでいいんだが,Java版が難しい(*2)。
![]() | Note.
(1999.08.09追記) Windowsでの標準エンコーディングはシフトJISではない。ISO/IEC 646 IRVとJIS X 0208をエンコードした「932」。 |
*1: アプレットからダイアログボックスを出す方法,あるいはgetlogin()に相当する方法が分からなかった。
*2: 標準のエンコーディングがMS932, ISO8859_1, SJISと多様で,どの環境でも使えるエンコーディング,又は実行時に使えるエンコーディング一覧を取得する方法がない。Javaは内部UnicodeなのにUTF-8を指定したらJava2 VM以外例外を投げるし。自前でUTF-8変換すればいいが,今度はLinux版でiconv()がないため,EUC-JPとエンコーディング変換する標準的な方法がない。あぅ。
Netsphere Laboratories http://www.nslabs.jp/
[PR]