Socket
クライアント側を表し、サーバー側を表す場合、サーバー側からデータを読み取るのはServerSocket
なぜですか? Socket.read
私は本当に混乱しています、私にそれを明確にしてもらえますか?
9 に答える
(ロジックを正しくすることが重要だと常に感じているため、この回答を投稿します。)
以下のサンプルをご覧になることをお勧めします。
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
ます。
socket.readがサーバーサイドからデータを読み取る理由
サーバーからネットワーク経由で送信されたデータを読み取っているため、サーバーのファイルシステムやリソース(db、ramなど)を直接読み取っているのではなく、ServerSocketによって既に処理されているデータを読み取っています。
SocketをWebブラウザー、ServerSocketをリモートWebサーバーと考えてください。
画像やページなどをリクエストすると、ウェブサーバー(ServerSocket)がバイトをクライアントに書き込みます。次に、クライアントはバイトを読み取って(ウェブサーバーが何を正しく送信したかを知るために)、最終的に表示して処理する必要があります。ユーザー。
同じことがServerSocket/Socketでも起こりましたが、より低いレベルでした。ソケットはServerSocketから情報を 読み取ります。
それは意味がありますか?
ServerSocketは、サーバーエンドポイントの追加機能を備えたソケットです。サーバーの機能には、ポートのリッスンや着信接続の受け入れなどが含まれます。
Socket
はクライアント側ServerSocket
用で、サーバー側用です。
サーバーから送信されたものを読んでいるためです。