- PR -

Javaネットワークプログラについて質問

1
投稿者投稿内容
会議室デビュー日: 2006/09/28
投稿数: 10
投稿日時: 2006-10-04 14:16
初歩レベル的な質問なのかと思いますが分からないので教えて下さい。

はじめに環境について説明します
・通信プロトコル:TCP/IP HTTP+SSL
・開発言語:Java(使用するクラスはHttpURLConnectionクラスなど)

処理のおおまかな流れについて説明します
1. AサーバーとBサーバーがあって、上記プロトコルでつながっている
2. Aサーバーにクライアントより送信要求(質問1)
3. AサーバーからBサーバーへ電文(XML)を送信
4. BサーバーはAサーバーからの電文をうけとる(質問2)
5. BサーバーはAサーバーに結果をかえす


(質問1) 複数人が同時に送信要求を行っても、その全てが送信されるのか?

  同時送信されるんか?、順番に送信されるのか?、同時受付には許容範囲があるのか?

(質問2) 複数人が同時に送信要求を行っても、その全てが処理されるか?

  スレッド対応をしないとどうなるのか。要求が届いた順に直列処理されるのか、
  つまり、要求が同時に10件きたら9件が待ち状態になるのか?

※ ○○のような作りだとこうなる、しかし△△の場合だとこうなる・・・といった
  回答を期待しております。

文の内容からも分かるように初心者です。
入門レベルだと思いますが、分かりやすい回答をお願い致します。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2006-10-04 23:05
>(質問1) 複数人が同時に送信要求を行っても、その全てが送信されるのか?
ネットワーク的な問題が無い限り、送信は全て行われると思います。

> 同時送信されるんか?、
ほぼ同時です。(表現が難しいですが)

> 順番に送信されるのか?、
複数クライアントから、ほぼ同時に送信している場合、順番というものの定義
ができないと思いますが、TCP/IPによる同一クライアントからの連続的な通信
以外、順序は保障されないと思います。

> 同時受付には許容範囲があるのか?
Bサーバのお話ですかね?だとすると、
 ・通信インターフェースの処理能力限界
 ・HTTPサーバの実装方法による限界
で、同時受付可能な値に限度が出てくると思います。要求する値を十分にカバー
できる値であれば良しという感じになるのではないでしょうか。

>(質問2) 複数人が同時に送信要求を行っても、その全てが処理されるか?
実装次第ですが、通常はそういった動作をするようにHTTPサーバは作ると思います。

>  スレッド対応をしないとどうなるのか。要求が届いた順に直列処理されるのか、

まず、一般的にJavaで並列処理を行う場合は、複数のスレッドを同時に走らせて
行います。したがって、単一のスレッドで通信処理を行った場合、初めに接続した
通信に対して付きっ切りということになるので、それが終わるまで後の接続は
順番待ちになると思います。待ち時間がTCP/IPのタイムアウトに達してしまった場合、
その接続クライアントの通信処理はお終いになってエラーになるでしょう。
なので、接続されたらその直後にその通信用にスレッドを割り当てて、メインの
処理側では、お次の接続を捌くというマルチスレッド処理になります。

と、Java1.3まではこれだけだったのですが、ネットワーク処理だけ見た場合、
Java1.4から入ってきた、NIOのSocketChannelクラスというものをノンブロ
ッキングモードで上手いこと処理すると、シングルスレッドでも並列(ほぼ)
に複数のリクエストに対して処理を行うことができます。

>  つまり、要求が同時に10件きたら9件が待ち状態になるのか?

ま、TCP/IPレベルではそういうことになってしまいます。

一度、簡易的なサーバーをお作りになってみてはいかがですか?。
シングルスレッド、というかmainメソッドだけで適当な文字でも
返す処理(echoみたいな)を作って、ローカルホスト上のプログラム
に割り当てたポート番号宛にブラウザなどでアクセスすれば、動作が
より理解できると思いますよ。
それから、マルチスレッドプログラムは通常のプログラムによりも
考慮しなければならないことがマルチに増えてくるので、同期処理など
一つ一つの処理を良く理解してから作り始めた方がよろしいと思います。
バグが出た場合に頼れるのは、並行に動くプログラムに対する想像力が
鍵になりますので。




[ メッセージ編集済み 編集者: 小僧 編集日時 2006-10-04 23:09 ]
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2006-10-04 23:42
引用:

榊さんの書き込み (2006-10-04 14:16) より:

はじめに環境について説明します
・通信プロトコル:TCP/IP HTTP+SSL




#レイヤーが微妙にずれてる、、、(苦笑)まぁ関係ないけど。

引用:


(質問1) 複数人が同時に送信要求を行っても、その全てが送信されるのか?
  同時送信されるんか?、順番に送信されるのか?、同時受付には許容範囲があるのか?



同時送信されます。順番はありません。
同時受付にはサーバ側に(一応)許容範囲があります。

例えば
client.java
class client {
main(args){
s = socket();
s.connect(server);
s.send("data"+args[1]);
}

を複数台(コマンドプロンプトが多数でもいい)
java client 0 〜 100
して実行すれば"data"をサーバに同時に贈りつけます。
どこの台であれ、同時に贈りつけます。

なぜ「一応」かというと、近年は処理速度が速いので余裕で受け取るからです。

引用:

(質問2) 複数人が同時に送信要求を行っても、その全てが処理されるか?
  スレッド対応をしないとどうなるのか。要求が届いた順に直列処理されるのか、
  つまり、要求が同時に10件きたら9件が待ち状態になるのか?



スレッド対応はあんまり関係ありません。CPUがたくさんあれば、たくさんCPUを割り付けるというだけです。
スレッド対応とやらをしても、また、しなくても、結局要求が届いた順に順列処理します。

要するに接続要求をまず受け付ける必要があるだけですから。

「待ち状態」になるかと言えば待ち状態になります。
カーネルの設定によりますが。

例えば、サーバが上記のクライアントからデータを受け取るとすると

data1
data100
data99
data98
data37
...

となります。数字はある意味偶然です。
1

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