Установка исходного порта на Сокете Java?

Я просто сделал простой тест, чтобы видеть, как instanceOf производительность по сравнению с простым s.equals (), звонят в строковый объект только с одной буквой.

в 10.000.000 циклично выполняются, instanceOf дал мне 63-96ms, и строка равняется, дал мне 106-230ms

, я использовал java jvm 6.

Так в моем простом тесте быстрее, чтобы сделать instanceOf вместо одного сравнения символьной строки.

.equals Целого числа использования () вместо строки дал мне тот же результат, только когда я использовал ==, я был быстрее, чем instanceOf на 20 мс (в 10 000 000 циклов)

11
задан AndreiM 2 December 2009 в 15:38
поделиться

5 ответов

Да, используйте метод bind () . Это отражает функцию bind () , доступную в большинстве реализаций сокетов C-уровня. Обратите внимание, что вы не всегда можете свободно выбирать, какой порт использовать, в некоторых системах некоторые диапазоны зарезервированы и считаются закрытыми для пользовательских приложений.

4
ответ дан 3 December 2019 в 08:30
поделиться

Обычно это происходит так:

Сначала Сервер открывает ServerSocket на известном порте и ожидает ввода.

Тем временем Клиент открывает (клиентский) Socket с имя хоста серверов и этот хорошо известный адрес порта. Он отправляет сообщение с запросом на сервер для инициализации сеанса связи.

Сервер получает сообщение, порождает рабочий поток, который открывает другой ServerSocket на другом порту, и сервер отправляет ответ, в котором сообщает клиенту этот порт. номер.

Теперь клиент закрывает фактическое соединение и создает новый Socket, теперь с номером порта, который ему только что сообщили.

Таким образом, сервер может обрабатывать более одного клиента за раз, потому что каждый клиент получает свое индивидуальное «соединение» (порт).

6
ответ дан 3 December 2019 в 08:30
поделиться

Вы можете использовать этот вызов для создания сокета,

public Socket(InetAddress address,
              int port,
              InetAddress localAddr,
              int localPort)
       throws IOException

Обычно это делается для UDP и не рекомендуется для TCP-соединений. Если вы сделаете это для TCP на обоих концах, у вас может быть только одно TCP-соединение. Если вы создадите еще один, уровень сокетов запутается, и вы потеряете все свои соединения.

Обычной практикой для TCP является ответ в том же соединении. Если вам нужно ответить через другое соединение, также используйте предварительно определенные порты на клиенте.

1
ответ дан 3 December 2019 в 08:30
поделиться

Во-первых, я настоятельно рекомендую вам использовать Java NIO.

DatagramChannel udpchannel = DatagramChannel.open();
DatagramSocket udpsocket = udpchannel.socket();
SocketAddress sa = new InetSocketAddress(BIND_ADDRESS, BIND_PORT);
udpsocket.bind(sa);

Во-вторых, используя привязку к адресу сокета, вы также сможете определить, к какому сетевому адресу вы будете подключены к. Это означает, что если вы установите для BIND_ADDRESS значение «0.0.0.0», вы сможете слушать с любой сетевой карты, подключенной к вашему серверу; но если вы установите для BIND_ADDRESS значение, например, «10.190.0.1», вы будете получать только запросы, прослушиваемые по такому адресу.

используя привязку к адресу сокета, вы также сможете определить, к какому сетевому адресу вы будете подключены. Это означает, что если вы установите для BIND_ADDRESS значение «0.0.0.0», вы сможете слушать с любой сетевой карты, подключенной к вашему серверу; но если вы установите для BIND_ADDRESS значение, например, «10.190.0.1», вы будете получать только запросы, прослушиваемые по такому адресу.

используя привязку к адресу сокета, вы также сможете определить, к какому сетевому адресу вы будете подключены. Это означает, что если вы установите для BIND_ADDRESS значение «0.0.0.0», вы сможете слушать с любой сетевой карты, подключенной к вашему серверу; но если вы установите для BIND_ADDRESS значение, например, «10.190.0.1», вы будете получать только запросы, прослушиваемые по такому адресу.

0
ответ дан 3 December 2019 в 08:30
поделиться

При использовании сокетов для дейтаграмм исходный адрес и порт устанавливаются сокетом при отправке дейтаграммы.

InetAddress sourceAddr = InetAddress.getLocalHost();
DatagramSocket sock = new DatagramSocket(sourcePort, sourceAddr);
DatagramPacket msg = new DatagramPacket(mbuf, mbuf.length, dstIP, dstPort);

sock.send(msg); // sent from sourcePort to dstPort

sourceAddr немного избыточен в этом примере, new DatagramSocket(sourcePort) будет привязан к предпочтительному лучшему адресу, но если вам нужно указать IP-адрес источника в дополнение к порту, вот как.

Для обоих типов сокетов при использовании bind(new InetSocketAddress(port)) будет выбран соответствующий локальный исходный адрес и указанный порт, а порт 0 также выберет соответствующий локальный порт.

Все можно получить с помощью getLocalAddress() и getLocalPort().

3
ответ дан 3 December 2019 в 08:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: