46

Socketクライアント側を表し、サーバー側を表す場合、サーバー側からデータを読み取るのはServerSocketなぜですか? Socket.read私は本当に混乱しています、私にそれを明確にしてもらえますか?

4

9 に答える 9

52

(ロジックを正しくすることが重要だと常に感じているため、この回答を投稿します。)

以下のサンプルをご覧になることをお勧めします。

http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html

Socket確かに、TCP/IP 通信を実行する場合、必要なすべての情報は、通信のみを目的としてクラスだけで提供できます。サーバー側でもクライアント側でも構いません。

上記のリンクからわかるように、サーバー側は次のコードを使用して独自のSocketインスタンスを取得します。つまり、別のソケットが同じサーバーのローカル ポートとクライアント ポートのペアに作成されます。

ここに画像の説明を入力

次に、サーバーはこのSocketインスタンスを使用してクライアントと通信します。

全体像を完成させるために、以下のコード スニペットはクライアントのインスタンスを示してますSocket

ここに画像の説明を入力

それで、Socketすでにすべてを実行できるのに、なぜまだ必要なのServerSocketですか?

これは、TCP/IP プロトコルを介した通信の作業パラダイムによるものです。

2 つのプログラムが TCP/IP を介して通信する場合、通常、一方は受動的にリッスン/待機し<IP:port>、もう一方はアクティブに接続します。

ご覧のとおり、まさにこのstarting phase通信で、2 つの側が非常に異なる動作をしています。したがって、この違いを反映するために 2 つの異なるクラスが使用されます。

  • Socketクラスは、アクティブ側の動作をカプセル化します。(別名クライアント)
  • ServerSocketクラスは、パッシブ側 (別名サーバー) の動作をカプセル化します。

ServerSocketがリッスン タスクとdetected着信接続を完了するaccept()と、新しいSocketインスタンスを作成して通信を容易にします。

同様に、java.nioパッケージには、ServerSocketChannelおよびSocketChannelクラスがあります。それでも、彼らは次のように振る舞います:

ServerSocketChannel -------------> SocketChannel
                      accept()

したがって、@JohnK がコメントで指摘したように、私はある程度同意しit's more or less just a 6-letter differenceます。

于 2015-07-01T06:57:09.180 に答える
12

socket.readがサーバーサイドからデータを読み取る理由

サーバーからネットワーク経由で送信されたデータを読み取っているため、サーバーのファイルシステムやリソース(db、ramなど)を直接読み取っているのではなく、ServerSocketによって既に処理されているデータを読み取っています。

SocketをWebブラウザー、ServerSocketをリモートWebサーバーと考えてください。

画像やページなどをリクエストすると、ウェブサーバー(ServerSocket)がバイトをクライアントに書き込みます。次に、クライアントはバイトを読み取って(ウェブサーバーが何を正しく送信したかを知るために)、最終的に表示して処理する必要があります。ユーザー。

同じことがServerSocket/Socketでも起こりましたが、より低いレベルでした。ソケットはServerSocketから情報を 読み取ります。

それは意味がありますか?

于 2010-01-05T06:40:11.867 に答える
1

ServerSocketは、サーバーエンドポイントの追加機能を備えたソケットです。サーバーの機能には、ポートのリッスンや着信接続の受け入れなどが含まれます。

于 2010-01-05T06:39:35.173 に答える
1

http://java.sun.com/docs/books/tutorial/networking/sockets/をご覧ください。

于 2010-01-05T08:07:23.677 に答える
0

Socketはクライアント側ServerSocket用で、サーバー側用です。

于 2010-04-16T14:38:19.593 に答える
0

サーバーから送信さたものを読んでいるためです。

于 2010-01-05T06:32:13.100 に答える