- PR -

Javaネットワークプログラムの基礎設計の勉強法

1
投稿者投稿内容
会議室デビュー日: 2006/09/28
投稿数: 10
投稿日時: 2006-09-29 00:13
システム間で電文を送受信する機能の設計を担当することになり悩んでおります。

「相手システムに電文を送信して、その結果を受信する」または、
「相手から送信されてきた電文を受け取って、その結果を返す」
っといった設計に関してまったくの素人です。

*ちなみに相手システムとは、別会社のシステムという意味です。補足しますと、
  1.自分のシステムで予約する
  2.予約内容に応じて電文を送信する会社を判断してその会社に送信
  3.送信結果を受信する(受付正常)
  −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
  4.しばらくたって、送信先の会社から予約完了通知が送信されてくる
  5.予約完了通知を受け取ったことを相手に伝える(返信)

なぜ素人に担当させるのかっといった事で突っ込まれると、
みもふたもないので、その点に関して触れないで下さい m(_ _)m

とりあえず、私のレベル(下記)にあった、分かりやすい参考書、
またはインターネットのサイトを見て基礎勉強(下記)からはじめたいのですが、
参考資料/サイトの紹介をお願いします。

<開発環境(案)>
OS:Solaris
言語:Java(自分からAシステムへ)とPerl(自分からBシステムへ)
プロトコル:https
電文はXML形式

<私のレベル>
https,SSL、SOAPといった通信用語の意味は知っている(つもり)
Javaは実装の経験は無いが解析は出来る。

<知りたいと思っている事>
※「思っている」の意味は、今まで見た事・聞いた事からインスピレーション的に、
「多分、この辺を押さえておかなければいけないんだろうな...」っと思っている事です。

・送受信処理のJavaの実装例
・送受信が1秒間に100回あってもレスポンス悪化しない方法
 (100回という数値は適当です。普通どれくらいを目標にするのですか?)
・通信エラー等の例外処理の実装方法
 (通信エラー発生時の電文はロストするのですか?それってどうリカバリー
  するのですか? その当たりに関する事)
・「なりすまし,盗聴,改ざん」っといった事に対する防御方法とその実装方法に関する事

宜しくお願いします。
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2006-09-29 01:26
引用:

榊さんの書き込み (2006-09-29 00:13) より:
システム間で電文を送受信する機能の設計を担当することになり悩んでおります。

・「なりすまし,盗聴,改ざん」っといった事に対する防御方法とその実装方法に関する事



純粋に質問なのですが。
「設計」の素人って、実装は玄人なわけですか。

JavaとかOSとか以前に、「コンピュータネットワーク」という概念の
基礎から考えたほうが。ましなのでは。
近年「電文」をひとつも受け取らない方が珍しいと思います。

だから、あまり「電文」とは言わないと思ってました。
リモートでさえ、普通に関数呼び出すだけの時代に「電文」もあるまい、と。

#もちろん仕事だから、いろんなシステムがあることは知ってるけど。。。

また、「なりすまし,盗聴,改ざん」等に対応するのは、大まかには「セキュリティ」
ということになります。いわゆる「暗号」「電子署名」がそれにあたります。

「情報セキュリティ」とかで、ぐぐればいろいろあるかと。

でも「HTTPS」と言い切ってしまえば、SSLでも、TLSでさえなくて、
いいのかもしれません。
その程度で。もう全部「通信はHTTPSで完璧です」ぐらいで。
後は何も考えないほうがいっそ吉かも。無駄だから、実際は。
#秘密鍵駄々漏れだったりして(苦笑)
#いや、HTTPSだから、いっそ共通鍵のみとか。
#やな設計だ。私は実装屋だが、そんな実装したくないな。

加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2006-09-29 01:57
引用:

榊さんの書き込み (2006-09-29 00:13) より:
・送受信処理のJavaの実装例
・送受信が1秒間に100回あってもレスポンス悪化しない方法
・通信エラー等の例外処理の実装方法
 (通信エラー発生時の電文はロストするのですか?それってどうリカバリー
  するのですか? その当たりに関する事)



回答付け加えるの忘れた。
(1)Java実装例。
Socket s=new Socket();
s.connect();
s.read();
s.write();

要するに「ソケット」でネットワークを仮想化してる場合が多いです。

(2)送受信が1秒間にn回取得
要するに受け取る側はがんばって受け取るだけに専念して
受け取った後はスレッドに流します。
for(1) {
swork = s.Accept();
thread(swork);
}

みたいな感じで。Accept()でとまってる実装もあれば、非同期の実装もあります。
このループが高速に回るなら、まわるだけ電文が受け取れてるわけです。
実測値をはかるのは昔にやったことがありますね。

(3)エラー処理の例外
「ソケット」で受送信できない場合、TCPなら再送制御しますが、UDPならしません。
ここらはTCP/IPの世界ですが、、、ぐぐればたくさんあると思います。

最近は明らかな間違いのところを探すぐらいで、そんなに間違ってないと思いますけど、どれも。

要するに低レイヤに任せる設計(TCP)も出来れば、自分で再送の制御を
行う実装(UDP)もあります。どうするかは、、、他の要因で、どのみちTCPに決まるでしょう。ちなみにTCPで再送に完全失敗したら、普通に電文は送りません。その場合はもいっかいTCPで再送命令をやり直すことになります。

最近、物理層は超高速なので、めったに起こらないと思いますけど。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-09-29 02:16
引用:

榊さんの書き込み (2006-09-29 00:13) より:
・送受信処理のJavaの実装例


ちょっと検索すればいくらでも転がってますよ。

HTTP(S)のサーバーならばJakarta Tomcatや商用コンテナ、
クライアントならJakarta Commons HttpClientが高機能です。

他の各種プロトコルのクライアントならJakarta Commons Netもあります。

オープンソースな実装がいっぱいあるので、ソースは読み放題ですよ。

引用:

・送受信が1秒間に100回あってもレスポンス悪化しない方法
 (100回という数値は適当です。普通どれくらいを目標にするのですか?)



要件と処理の内容次第でしょう。
どこがネックになるかに激しく依存します。

接続数やI/O負荷が問題ならJDK 1.4以降のNIOで多重化通信も可能です。
業務系システムじゃ他の要因の方が可能性は高いと思いますが。

引用:

・通信エラー等の例外処理の実装方法
 (通信エラー発生時の電文はロストするのですか?それってどうリカバリー
  するのですか? その当たりに関する事)



Javaに限った話ではないと思うのですが…。
単純なリトライや2PC的なアプローチでしょうかね?

引用:

・「なりすまし,盗聴,改ざん」っといった事に対する防御方法とその実装方法に関する事



これもJavaに限った話ではないですね。
暗号(公開鍵暗号やら)のお勉強をしましょう。

SSL/TLSで(有名CAの)証明書を使って、きちんと秘密鍵の管理が
できていれば標準的なレベルは十分に確保できているはずです。
#クライアントが正しくサーバ証明書の検証を行っている前提ですが。
1

スキルアップ/キャリアアップ(JOB@IT)