Я просто сделал простой тест, чтобы видеть, как instanceOf производительность по сравнению с простым s.equals (), звонят в строковый объект только с одной буквой.
в 10.000.000 циклично выполняются, instanceOf дал мне 63-96ms, и строка равняется, дал мне 106-230ms
, я использовал java jvm 6.
Так в моем простом тесте быстрее, чтобы сделать instanceOf вместо одного сравнения символьной строки.
.equals Целого числа использования () вместо строки дал мне тот же результат, только когда я использовал ==, я был быстрее, чем instanceOf на 20 мс (в 10 000 000 циклов)
Да, используйте метод
. Это отражает функцию bind () bind ()
, доступную в большинстве реализаций сокетов C-уровня. Обратите внимание, что вы не всегда можете свободно выбирать, какой порт использовать, в некоторых системах некоторые диапазоны зарезервированы и считаются закрытыми для пользовательских приложений.
Обычно это происходит так:
Сначала Сервер открывает ServerSocket на известном порте и ожидает ввода.
Тем временем Клиент открывает (клиентский) Socket с имя хоста серверов и этот хорошо известный адрес порта. Он отправляет сообщение с запросом на сервер для инициализации сеанса связи.
Сервер получает сообщение, порождает рабочий поток, который открывает другой ServerSocket на другом порту, и сервер отправляет ответ, в котором сообщает клиенту этот порт. номер.
Теперь клиент закрывает фактическое соединение и создает новый Socket, теперь с номером порта, который ему только что сообщили.
Таким образом, сервер может обрабатывать более одного клиента за раз, потому что каждый клиент получает свое индивидуальное «соединение» (порт).
Вы можете использовать этот вызов для создания сокета,
public Socket(InetAddress address,
int port,
InetAddress localAddr,
int localPort)
throws IOException
Обычно это делается для UDP и не рекомендуется для TCP-соединений. Если вы сделаете это для TCP на обоих концах, у вас может быть только одно TCP-соединение. Если вы создадите еще один, уровень сокетов запутается, и вы потеряете все свои соединения.
Обычной практикой для TCP является ответ в том же соединении. Если вам нужно ответить через другое соединение, также используйте предварительно определенные порты на клиенте.
Во-первых, я настоятельно рекомендую вам использовать 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», вы будете получать только запросы, прослушиваемые по такому адресу.При использовании сокетов для дейтаграмм исходный адрес и порт устанавливаются сокетом при отправке дейтаграммы.
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()
.