Я должен к heartbeat сохранить соединение TCP открытым?

getElementsByTagName возвращает список узлов, у которого нет метода с именем getElementsByAttribute, но ТОЛЬКО если у вас есть доступ к DOM

Без DOM (например, node.js)

const hrefRe = /href="(.*?)"/g;
const urlRe = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’&quote]))/ig;

 
const stringFromDB = `<a href="http://000">000</a>
Something something <a href="http://001">001</a> something`

stringFromDB.match(hrefRe).forEach(
 (href) => console.log(href.match(urlRe)[0] ) 
);

// oldschool: 
// stringFromDB.match(hrefRe).forEach(function(href) {  console.log(href.match(urlRe)[0] )      });

В этом коде я сначала создаю фрагмент кода DOM. Также я ТОЛЬКО получаю якоря, которые имеют href для начала с

[1115 ] ПРИМЕЧАНИЕ. getAttribute, поэтому браузер не пытается интерпретировать URL-адрес. 1123]
const re = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’&quote]))/ig;

const stringFromDB = `<a href="http://000">000</a>
<a href="http://001">001</a>`

let doc = document.createElement("div");
doc.innerHTML = stringFromDB

doc.querySelectorAll("a[href]").forEach(
  (x) => console.log(x.getAttribute("href").match(re)[0])
);

Без регулярного выражения

const stringFromDB = `<a href="http://000">000</a>
<a href="http://001">001</a>`

let doc = document.createElement("div");
doc.innerHTML = stringFromDB

doc.querySelectorAll("a[href]").forEach(
 (x) => console.log(x.getAttribute("href")) 
);

91
задан Rob Gray 14 May 2009 в 21:44
поделиться

13 ответов

Соединение должно оставаться открытым независимо от того, но да, часто можно увидеть, что протоколы реализуют контрольный сигнал, чтобы помочь обнаружить мертвые соединения, например IRC с командой PING .

]
53
ответ дан 24 November 2019 в 06:48
поделиться

Соединение останется открытым - нет необходимости реализовывать контрольный сигнал, и большинство приложений, использующих сокеты, этого не делают.

0
ответ дан 24 November 2019 в 06:48
поделиться

Многие протоколы реализуют контрольный сигнал или состояние здоровья, как сказал Ллойд. Просто чтобы вы знали, что соединение все еще открыто, и если вы что-то пропустили

-2
ответ дан 24 November 2019 в 06:48
поделиться

Heartbeat не является необходимостью для протоколов TCP. Его реализация предназначена для определения того, завершила ли другая сторона соединение нестандартным способом (т.е. не прошла ли процесс разрыва).

1
ответ дан 24 November 2019 в 06:48
поделиться

TCP / IP в качестве протокола указан как не закрываемый до тех пор, пока вы не отправите закрывающий пакет. У меня розетки оставались открытыми даже после нестабильного беспроводного или интернет-соединения.

Однако все это очень зависит от реализации. Скорее всего, будет «тайм-аут», который означает максимальное время ожидания ответа, прежде чем считать соединение «мертвым». Иногда это основано на самом приложении, иногда на маршрутизаторах NAT.

Поэтому я настоятельно рекомендую вам сохранять «контрольный сигнал», чтобы обнаруживать плохие соединения и держать их открытыми.

1
ответ дан 24 November 2019 в 06:48
поделиться

Я бы сказал, что если у вас нет пульса, не имеет значения, открыто ваше TCP / IP-соединение или нет.

1
ответ дан 24 November 2019 в 06:48
поделиться

То, что вы называете пульсом, полезно при попытке установить тайм-ауты. Ваш сокет может показаться открытым, но человек на другом конце может страдать от BSOD. Один из самых простых способов обнаружить неработающие клиенты / серверы - установить тайм-аут и убедиться, что сообщение поступает так часто.

Некоторые люди называют их NOOP (No Ops).

Но нет, они не нужны чтобы поддерживать соединение, полезно знать только статус.

1
ответ дан 24 November 2019 в 06:48
поделиться

Необходимы ли тактовые импульсы для поддержания активности соединения TCP / IP?

Они полезны для обнаружения разрыва соединения.

3
ответ дан 24 November 2019 в 06:48
поделиться

Вам не нужно отправлять сердцебиение самостоятельно. Соединение TCP останется открытым независимо от использования.

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

10
ответ дан 24 November 2019 в 06:48
поделиться

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

48
ответ дан 24 November 2019 в 06:48
поделиться

TCP будет поддерживать соединение. Контрольные сообщения приложения предназначены для рассмотрения на уровне приложений, таких как переключение при отказе, балансировка нагрузки или предупреждение администраторов о потенциальных проблемах.

2
ответ дан 24 November 2019 в 06:48
поделиться

Сердцебиение - это хороший способ сообщить серверу, что вы живы. Я имею в виду, что если сервер использует системы предотвращения DoS-атак, он (сервер) может удалить все выделенные ресурсы для этого конкретного соединения после обнаружения бездействия в течение определенного периода.
У них нет полномочий на внедрение каких-либо механизмов сердцебиения.

Но это хорошо, если вы разрабатываете приложение, где основным критерием является отзывчивость. Вам не захочется тратить время на настройку подключения, поиск DNS и поиск путей. Просто поддерживайте соединение все время, продолжайте посылать биения, и приложение знает, что соединение активно, и установка соединения не требуется. Просто отправьте и получите.

3
ответ дан 24 November 2019 в 06:48
поделиться

Если вы используете Windows, будьте осторожны в отношении TCP Affive. По умолчанию его отключено, если вы либо не включите его во всем мире с реестром Windows или через Setococopt.

Интервал хранения по умолчанию - 2 часа.

http://msdn.microsoft.com/en-us/library/ms819735.aspx

Вам может потребоваться реализовать свое собственное сердцебиение и отключить TCP Aff-yellow на Windows, если 2 часа живой не желательно.

9
ответ дан 24 November 2019 в 06:48
поделиться