Если Socket
представляет клиентскую сторону, а ServerSocket
представляет серверную сторону, почему Socket.read
считывает данные со стороны сервера? Я действительно смущен. Не могли бы вы прояснить это мне?
В чем разница между Socket и ServerSocket?
Ответ 1
(Я публикую этот ответ, потому что всегда чувствую, что логика должна быть правильной.)
Я предлагаю вам взглянуть на следующий пример.
http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html
Следует признать, что при осуществлении связи по TCP/IP вся необходимая информация может быть предоставлена только одним классом Socket
для единственной цели связи. Неважно, на стороне сервера или на стороне клиента.
Как видно из приведенной выше ссылки, серверная сторона использует следующий код для получения своего собственного экземпляра Socket
. То есть другой сокет создается на том же локальном порту сервера и паре клиентского порта.
Затем сервер использует этот экземпляр Socket
для связи с клиентом.
И чтобы завершить картину, приведенный ниже фрагмент кода показывает клиент t Socket
экземпляр.
Так что, если 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
:
- Прежде всего, давайте проясним тот факт, что наш
client
имеет свой собственныйSocket
и знаетserver
IP-адрес и порт. Дляserver
предусмотрены толькоServerSocket
и порт. В обоих случаях порты имеют одинаковые номера от 0 до 65535. Итак, мы решили подключить наш
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 с дополнительными функциями конечной точки сервера. Функции сервера включают прослушивание порта и прием входящего соединения и т.д.
Ответ 6
Взгляните на http://java.sun.com/docs/books/tutorial/networking/sockets/
Ответ 7
ServerSocket
создается для bind
для порта и listen
для connect
клиента. Таким образом, сервер просто ждет разговора и не запускает его.
ClientSocket
создается с connect
сервером listen
. Клиент инициирует соединение.
Пример. Рассмотрим пример входящего центра обработки вызовов. Эти сервисы являются серверами. Они не инициируют вызов, а ждут вызова от клиентов. После того, как звонки включены, они могут участвовать в двухстороннем разговоре.
Ответ 8
Потому что он читает то, что было отправлено вам сервером.
Ответ 9
Socket
для клиентской стороны, а ServerSocket
- для серверной части.