web-dev-qa-db-ja.com

SocketとServerSocketの違いは何ですか?

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

33
sevugarajan

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

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

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

確かに、TCP/IP通信を実行する場合、すべての必要な情報は、通信の唯一の目的のためにSocketクラスのみで提供できます。サーバー側またはクライアント側に関係なく。

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

enter image description here

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

そして、図を完全にするために、以下のコードスニペットは clien tのSocketインスタンスを示しています。

enter image description here

それで、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_。

27
smwikipedia

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

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

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

画像やページなどをリクエストすると、ウェブサーバー(The ServerSocket)がクライアントにバイトを書き込み、クライアントは順番にそれらを読み取って(ウェブサーバーが正しく送信したものを知るには?)、最後に表示して処理しますユーザー。

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

それは理にかなっていますか?

9
OscarRyz

Java.net.ServerSocket

このクラスはサーバーソケットを実装します。サーバーソケットは、ネットワーク経由で要求が着信するのを待ちます。そのリクエストに基づいて何らかの操作を実行し、場合によってはリクエスタに結果を返します。

Java.net.Socket

このクラスは、クライアントソケット(「ソケット」とも呼ばれます)を実装します。ソケットは、2台のマシン間の通信のエンドポイントです。

8
Marc Juchli

まず、IS Socketがどのように見えるかを明確にしましょう。一般的な場合、Socketは、_:_を介したIPとポートの連結です。たとえば、_127.0.0.1:8080_。

そこで、Socketを使用してクライアントサーバーアプリケーションを作成することにしました。それほど複雑なことはありません。 clientserverの接続に関する簡単な説明を次に示します。

  1. まず、その事実を明確にしましょう。clientには独自のSocketがあり、serverのIPアドレスとポートを知っています。 serverには、ServerSocketとポートのみが提供されます。どちらの場合も、ポートは0〜65535の同じ番号です。
  2. そこで、clientserverに接続することにしました。

    • clientは、既知のIPとserverのポートを使用して、彼の_Socket clientSocket_オブジェクトを作成します。

    • serverは、新しい_Socket newClientSocket_オブジェクトを生成するServerSocket.accept()メソッドを使用して、着信接続要求を受け取りました(まだserver側(!)にあります)。

    • さらにデータ交換は、clientSocketおよびnewClientSocketオブジェクトを介して行われます(clientSocketServerSocketの間ではありません)。

ここ は、基本的な接続プロセスを理解するためのほぼ完璧な画像です(この画像のSocket上のClientオブジェクト-同じオブジェクトを覚えておいてください)。

この単純な構造を作成したら、情報を読み書きするために_Client.clientSocket_と_Server.newClientSocket_の両方の側で2つのストリームを開く必要があります。

7
SuppieRK

ServerSocketはポートへのbindに対して作成され、listenはクライアントからのconnectに対して作成されます。そのため、サーバーは会話を待ち、会話を開始しません。

ClientSocketは、connectからlisteningサーバーに作成されます。クライアントが接続を開始します。

例:インバウンドコールセンターを例として考えてください。これらのサービスはサーバーです。彼らは電話をかけるのではなく、クライアントから電話が来るのを待ちます。通話が開始されると、双方向の会話を行うことができます。

1
pgcool

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

1
ArunDhaJ
1
Carnell

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

0

それはあなたに送信されたものを読んでいるからですbyサーバー。

0
Noon Silk