Socket
がクライアント側を表し、ServerSocket
がサーバー側を表す場合、なぜSocket.read
サーバー側からデータを読み取りますか?私は本当に混乱しています、私にそれを明確にしてください。
(論理を正しくすることが常に重要だと感じているため、この回答を投稿します。)
次のサンプルをご覧になることをお勧めします。
http://docs.Oracle.com/javase/tutorial/networking/sockets/clientServer.html
確かに、TCP/IP通信を実行する場合、すべての必要な情報は、通信の唯一の目的のためにSocket
クラスのみで提供できます。サーバー側またはクライアント側に関係なく。
上記のリンクからわかるように、サーバー側は、次のコードを使用して独自のSocket
インスタンスを取得します。つまり、 another ソケットは、同じサーバーのローカルポートとクライアントポートのペアに作成されます。
次に、サーバーはこのSocket
インスタンスを使用してクライアントと通信します。
そして、図を完全にするために、以下のコードスニペットは clien tのSocket
インスタンスを示しています。
それで、Socket
がすでにすべてを実行できる場合、なぜServerSocket
が必要なのでしょうか?
これは、TCP/IPプロトコルを介した通信の実用的なパラダイムが原因です。
2つのプログラムがTCP/IPを介して通信する場合、通常1つは受動的に_<IP:port>
_でリッスン/待機し、もう1つはアクティブにしますそれに接続します。
あなたは、通信のこの_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サーバーとして考えてください。
画像やページなどをリクエストすると、ウェブサーバー(The ServerSocket)がクライアントにバイトを書き込み、クライアントは順番にそれらを読み取って(ウェブサーバーが正しく送信したものを知るには?)、最後に表示して処理しますユーザー。
同じことがServerSocket/Socketでも発生しましたが、より低いレベルで発生しました。ソケット読み取り ServerSocketからの情報。
それは理にかなっていますか?
Java.net.ServerSocket
このクラスはサーバーソケットを実装します。サーバーソケットは、ネットワーク経由で要求が着信するのを待ちます。そのリクエストに基づいて何らかの操作を実行し、場合によってはリクエスタに結果を返します。
Java.net.Socket
このクラスは、クライアントソケット(「ソケット」とも呼ばれます)を実装します。ソケットは、2台のマシン間の通信のエンドポイントです。
まず、IS Socket
がどのように見えるかを明確にしましょう。一般的な場合、Socket
は、_:
_を介したIPとポートの連結です。たとえば、_127.0.0.1:8080
_。
そこで、Socket
を使用してクライアントサーバーアプリケーションを作成することにしました。それほど複雑なことはありません。 client
とserver
の接続に関する簡単な説明を次に示します。
client
には独自のSocket
があり、server
のIPアドレスとポートを知っています。 server
には、ServerSocket
とポートのみが提供されます。どちらの場合も、ポートは0〜65535の同じ番号です。そこで、client
をserver
に接続することにしました。
client
は、既知のIPとserver
のポートを使用して、彼の_Socket clientSocket
_オブジェクトを作成します。
server
は、新しい_Socket newClientSocket
_オブジェクトを生成するServerSocket.accept()
メソッドを使用して、着信接続要求を受け取りました(まだserver
側(!)にあります)。
さらにデータ交換は、clientSocket
およびnewClientSocket
オブジェクトを介して行われます(clientSocket
とServerSocket
の間ではありません)。
ここ は、基本的な接続プロセスを理解するためのほぼ完璧な画像です(この画像のSocket
上のClient
オブジェクト-同じオブジェクトを覚えておいてください)。
この単純な構造を作成したら、情報を読み書きするために_Client.clientSocket
_と_Server.newClientSocket
_の両方の側で2つのストリームを開く必要があります。
ServerSocket
はポートへのbind
に対して作成され、listen
はクライアントからのconnect
に対して作成されます。そのため、サーバーは会話を待ち、会話を開始しません。
ClientSocket
は、connect
からlisten
ingサーバーに作成されます。クライアントが接続を開始します。
例:インバウンドコールセンターを例として考えてください。これらのサービスはサーバーです。彼らは電話をかけるのではなく、クライアントから電話が来るのを待ちます。通話が開始されると、双方向の会話を行うことができます。
ServerSocketは、サーバーエンドポイントの追加機能を備えたソケットです。サーバー機能には、ポートのリッスンや着信接続の受け入れなどが含まれます。
Socket
はクライアント側用で、ServerSocket
はサーバー側用です。
それはあなたに送信されたものを読んでいるからですbyサーバー。