Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Почему метод accept объекта ServerSocket возвращает объект Socket с другим портом

Автор вопроса: RaminОтветов: 2

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

JAVA Код:

package chat.server;

import java.io.*;
import java.net.*;

public class ServerApp {
    public String[] advices = {"Take smaller bites",
            "Go for the tight jeans. No they do NOT make you look fat.",
            "One word: inappropriate",
            "Just for today, be honest. Tell your boss what you *really* think",
            "You might want to rethink that haircut."};
    public ServerSocket serverSocket;

    public ServerApp()
    {
        try
        {
            serverSocket = new ServerSocket(4245);
            System.out.println("Server Started.");
        }catch (Exception exception)
        {
            exception.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ServerApp server = new ServerApp();
        while(true)
        {
                server.sendMessage();
        }

    }

    public void sendMessage()
    {
        String advice;
        try
        {
            Socket socket = serverSocket.accept();//here comes my question
            System.out.println(socket.getPort());
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream());

            advice = getAdvice();
            printWriter.write(advice);

            printWriter.close();
            System.out.println(advice);
        }catch (Exception exception)
        {
            exception.printStackTrace();
        }
    }

    private String getAdvice() {
        int random = (int) (Math.random() * advices.length);
        return advices[random];
    }
}

Разве это не нормально, что сервер слушает и отвечает клиенту с одного и того же номера порта?

javanetworkingsocketsport

Ответы

Ответ 1 · рейтинг 2 · T.J. Crowder

Если вы хотите вернуть значение 4245 (порт, который прослушивает ваш серверный сокет) из подключенного сокета, вам нужен getLocalPort, а не getPort.

getPort:

Возвращает номер удаленного порта, к которому подключен этот сокет.

getLocalPort:

Возвращает локальный номер порта, к которому привязан этот сокет.

(выделено мной)

Ответ 2 · user207421

почему метод accept() объекта ServerSocket возвращает объект Socket, прослушивающий другой порт на серверной машине

Это не так. То, на что вы смотрите, это удаленный порт на стороне клиента. Локальный порт задается getLocalPort(), и совпадает с ServerSocket's.

NB Только ServerSocket "слушает". Принятый Socket подключен и готов к вводу-выводу.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы