Подтвердить что ты не робот

В чем разница между Socket и ServerSocket?

Если Socket представляет клиентскую сторону, а ServerSocket представляет серверную сторону, почему Socket.read считывает данные со стороны сервера? Я действительно смущен. Не могли бы вы прояснить это мне?

4b9b3361

Ответ 1

(Я публикую этот ответ, потому что всегда чувствую, что логика должна быть правильной.)

Я предлагаю вам взглянуть на следующий пример.

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

Следует признать, что при осуществлении связи по TCP/IP вся необходимая информация может быть предоставлена только одним классом Socket для единственной цели связи. Неважно, на стороне сервера или на стороне клиента.

Как видно из приведенной выше ссылки, серверная сторона использует следующий код для получения своего собственного экземпляра Socket. То есть другой сокет создается на том же локальном порту сервера и паре клиентского порта.

enter image description here

Затем сервер использует этот экземпляр Socket для связи с клиентом.

И чтобы завершить картину, приведенный ниже фрагмент кода показывает клиент t Socket экземпляр.

enter image description here

Так что, если Socket может все это сделать, зачем нам все еще нужен ServerSocket?

Это из-за рабочей парадигмы связи по протоколу TCP/IP.

Когда две программы взаимодействуют по TCP/IP, обычно одна пассивно прослушивает/ожидает на <IP:port>, а другая активно подключается к нему.

Итак, вы можете видеть, что на этом самом starting phase сообщении две стороны ведут себя совершенно по-разному. Поэтому для отражения этой разницы используются 2 разных класса.

  • Класс Socket инкапсулирует поведение активной стороны. (a.k.a. клиент)
  • Класс ServerSocket инкапсулирует поведение пассивной стороны (например, сервера)

Как только ServerSocket завершит свою задачу прослушивания и detected будет входящее соединение, он accept() установит его и создаст новый экземпляр Socket для облегчения связи.

Аналогично, в пакете java.nio вы найдете классы ServerSocketChannel и SocketChannel. И все же они ведут себя так:

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

Итак, в некоторой степени я согласен с @JohnK, как он указал в комментарии it more or less just a 6-letter difference.

Ответ 2

почему socket.read читает данные с serveride

Поскольку он считывает данные отправлено сервером через сеть, он не читает напрямую файловую систему сервера или не сохраняет (db, ram или что-то в этом роде) он считывает данные, которые уже были обработаны ServerSocket.

Подумайте о Socket в качестве веб-браузера и ServerSocket в качестве удаленного веб-сервера.

Когда вы запрашиваете изображение, страницу и т.д., веб-сервер (ServerSocket) записывает байты клиенту, в свою очередь, клиент должен их читать (чтобы знать, что веб-сервер отправил правильно?) и обрабатывать их, показывая их конечному пользователю.

То же самое происходит с ServerSocket/Socket, но на более низком уровне. Сокет считывает информацию из ServerSocket.

Имеет ли смысл?

Ответ 3

java.net.ServerSocket

Этот класс реализует серверные сокеты. Сету сервера ждет запросы на вход в сеть. Он выполняет некоторые операции на основе по этому запросу, а затем, возможно, возвращает результат запрашивающему.

java.net.Socket

Этот класс реализует клиентские сокеты (также называемые просто "сокетами" ). socket - это конечная точка для связи между двумя машинами.

Ответ 4

Прежде всего, давайте проясним, как выглядит IS Socket: в общем случае Socket является объединением IP и порта через :, например: 127.0.0.1:8080.

Итак, вы решили создать клиент-серверное приложение, используя Socket. Там ничего особо сложного нет. Вот краткое объяснение о создании связи между client и server:

  1. Прежде всего, давайте проясним тот факт, что наш client имеет свой собственный Socket и знает server IP-адрес и порт. Для server предусмотрены только ServerSocket и порт. В обоих случаях порты имеют одинаковые номера от 0 до 65535.
  2. Итак, мы решили подключить наш client к нашему server:

    • client создает свой объект Socket clientSocket с известным IP-адресом и портом нашего server.

    • server получил входящий запрос на соединение с его методом ServerSocket.accept(), который генерирует новый объект Socket newClientSocket (все еще на стороне server (!)).

    • Дальнейший обмен данными происходит через объекты clientSocket и newClientSocket (не между clientSocket и ServerSocket).

Здесь - почти идеальная картинка для понимания основного процесса подключения (имейте в виду, что объект Socket на Client на этом рисунке - те же объекты).

После того, как вы создали эту простую структуру, вам нужно открыть два потока на обеих сторонах Client.clientSocket и Server.newClientSocket для чтения и записи информации.

Ответ 5

ServerSocket снова представляет собой Socket с дополнительными функциями конечной точки сервера. Функции сервера включают прослушивание порта и прием входящего соединения и т.д.

Ответ 7

ServerSocket создается для bind для порта и listen для connect клиента. Таким образом, сервер просто ждет разговора и не запускает его.

ClientSocket создается с connect сервером listen. Клиент инициирует соединение.

Пример. Рассмотрим пример входящего центра обработки вызовов. Эти сервисы являются серверами. Они не инициируют вызов, а ждут вызова от клиентов. После того, как звонки включены, они могут участвовать в двухстороннем разговоре.

Ответ 8

Потому что он читает то, что было отправлено вам сервером.

Ответ 9

Socket для клиентской стороны, а ServerSocket - для серверной части.