Как входной поток и выходной поток одного и того же сокета видят друг друга? - PullRequest
0 голосов
/ 08 января 2020

Здравствуйте, я изучаю пример сервер-клиентского приложения, и я не понимаю, как клиент получает строку с сервера.

Сервер запускает поток, который делает это:

String seq = generateSequence(l); //random stuff
        outSocket.println(seq);

в клиентском классе есть такой код:

 String serverSeq = inSocket.readLine();
        System.out.println(serverSeq);

и inSocket и outSocket реализованы одинаково как в потоке, так и в клиентских классах, с:

inSocket = new BufferedReader(new InputStreamReader(socket.getInputStream()));
outSocket = new PrintWriter(new BufferedWriter(
                        new OutputStreamWriter(socket.getOutputStream())), true);

, где socket тоже тот же объект, это сокет клиента

У меня вопрос, почему строка serverSeq точно соответствует строке seq? Сервер записывает в выходной поток, а клиент получает данные из входного потока, не являются ли эти две разные области памяти?

Ответы [ 2 ]

1 голос
/ 08 января 2020

Ну, на самом деле проблема была в том, что я думал, что серверная accept() функция возвращает клиентский сокет, но не возвращает, он возвращает новый сокет, который ведет диалог с клиентским сокетом, но это два разных объекта, поэтому inSocket и outSocket и на клиенте, и на сервере ссылаются на два разных сокета, а не на один и тот же.

Сервер записывает строку в свой выходной поток, а затем переходит во входной поток клиента, который вполне логичен c, я понял, что сервер записывает строку в выходной поток клиента, и это не имело смысла.

0 голосов
/ 08 января 2020

Существует много базового программного обеспечения и потенциально аппаратного обеспечения, если вы используете сокеты по сети.

Реализация может зависеть от ОС / платформы, но в целом порт будет открыт на обоих концы р c. Данные будут передаваться между портами каким-либо образом, вероятно, через какой-то тип ввода-вывода с отображением в памяти, а затем поступают в сеть или в локальном случае, возможно, просто маршрутизируются командами процессора или памяти. Для локального случая, скорее всего, данные копируются в буфер / пространство памяти сокета сервера, и readline просто читает его и перемещает указатель адреса, чтобы указать, что данные были прочитаны.

Это все скрыто для вас, поэтому если вы не работаете над кодом низкого уровня для него, вам не нужно слишком заботиться о том, как данные отправляются и принимаются, но как минимум вы должны понимать различные протоколы, обычно используемые (TCP, UDP, RAW).

РЕДАКТИРОВАТЬ: даже если вы используете localhost, он, скорее всего, go подключится к сетевому контроллеру вашей системы, а затем просто возвратится по шлейфу. Маловероятно, что система оптимизирует его для обхода сетевого контроллера и просто копирует данные прямо в приемный сокет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...