Сервер может использовать тот же сокет, чтобы отправить ответ клиенту? как?

Похоже, вы хотите перебрать все с идентификатором jamberangkat. Помните, что идентификаторы должны быть уникальными во всем DOM , поэтому вам нужно будет использовать класс для идентификации той ячейки, которую вы хотите изменить.

Большинство методов jQuery на самом деле являются неявными итераторами, поэтому вы можете просто использовать обратный вызов в $('.jamberangkat').text() для выполнения фильтрации текста для вас для всех элементов, соответствующих селектору . В этом фильтре вы хотите:

  1. Извлечь текстовое значение элемента. Это доступно в качестве второго аргумента в методе .text(): см. Документацию jQuery API для .text()
  2. Разделить текст на :, как вы и предполагали
  3. Сохраните только первые два элемента (в своем коде, который я вывел, вы хотите сохранить только первый и второй фрагмент массива). Это можно сделать с помощью .slice(0, 2)
  4. Присоединиться к массиву сращений (который теперь содержит только первые два элемента) с помощью .join(':').

См. Пример подтверждения концепции ниже:

$(document).ready(function(){
    $(".jamberangkat").text(function(index, txt) {
      return txt.split(':').slice(0,2).join(':');
    });
});

12:34:56 Random text
12:34:56 Random text
12:34:56 Random text
12:34:56 Random text

12
задан mmutilva 21 January 2009 в 23:48
поделиться

9 ответов

Можно использовать тот же сокет, НО программа настраивается, чтобы считать сервер ВСЕ, что клиент отправляет прежде, чем попытаться ответить. Таким образом, цикл в сервере не завершится, пока клиент не закроет сторону записи ее сокета, таким образом, сервер получает EOF (0-байтовое чтение), и таким образом сервер никогда не будет передавать свой ответ обратно.

Существует несколько способов, которыми можно иметь дело с этим.

  1. Можно повредить цикл в сервере после его замеченного целый запрос, вместо того, чтобы читать до EOF. Это требует, чтобы данные, отправленные клиентом, саморазграничили так или иначе, таким образом, сервер может знать когда его чтение все это.
  2. Можно использовать второе соединение для ответа. Вероятно, не лучшее.
  3. Можно использовать асимметричное завершение работы сокета. Сделайте, чтобы клиент сделал shutdown(client_socket, SHUT_WR) полузакрыть сокет. Сервер будет затем видеть EOF (и цикл закончится), но другое направление на сокете все еще будет открыто для ответа.
8
ответ дан 2 December 2019 в 05:42
поделиться

Необходимо использовать тот же сокет!

Ваш прикладной протокол определяет однозначно, когда клиент и сервер должны ожидать данных или отправить сообщения друг другу; принимая протокол только с одним запросом от клиента и одним ответом с сервера, следующее должно содержать:


  • Клиент устанавливает соединение с сервером;
  • клиент отправляет его запрос (с, отправляют ());
  • клиент знает, на основании протокола, что сервер ответит; поэтому это ожидает данных по тому же сокету (recv ());
  • после проверки ответа клиент может закрыть сокет.

  • Сервер принимает соединение от клиента;
  • сервер знает, что первый шаг до клиента, следовательно он ожидает данных (recv ());
  • сервер проверяет запрос;
  • сервер теперь знает из протокола, что клиент ожидает данных; следовательно это отправляет, его ответ с отправляют ();
  • сервер знает из протокола, что нет никаких дальнейших шагов; следовательно это может закрыть сокет.
10
ответ дан 2 December 2019 в 05:42
поделиться

Да, это возможно. Выезд взгляда эта страница для примера простого сервера (и простого клиента). Обратите внимание, что сервер обычно передает "принять" дескриптор файла редактора в новый процесс так, чтобы он мог продолжить прислушиваться к большему количеству входящих соединений

3
ответ дан 2 December 2019 в 05:42
поделиться

Мало того, что необходимо использовать тот же сокет (поскольку Federico говорит), Вы на самом деле имеете к тому, для получения возвращаемых пакетов через брандмауэры.

Брандмауэры знают о соединениях TCP и автоматически позволяют данным возврата проходить, если машина в брандмауэре инициировала соединение. Если бы вместо этого Вы пытались создать новый сокет TCP из внешней стороны, то брандмауэр заблокировал бы ее, если тот трафик не был конкретно разрешен.

2
ответ дан 2 December 2019 в 05:42
поделиться

Да, сокеты SOCK_STREAM являются двухсторонними. Необходимо смочь читать и записать в тот же сокет на каждой стороне соединения. Страница справочника для socket(2) имеет больше детали об этом.

1
ответ дан 2 December 2019 в 05:42
поделиться

Да, Вы можете. Сокеты TCP двунаправлены. Просто используйте то же чтение () и запись () функции. Также удостоверьтесь, что проверили на состояния ошибки на всех вызовах, чтобы соединиться (), читать (), записать ()... поскольку Вы не можете управлять тем, что происходит в сети.

1
ответ дан 2 December 2019 в 05:42
поделиться

Прошу прощения; Я не сказал это, но я действительно пробовал его как это

Этот код в сервере, где комментарий:

write(connected_socket, "Ok, I got it", sizeof("Ok, I got it"));

и этот код в клиенте, где комментарий:

read(client_socket, buf, sizeof(buf));

Обе программы сохраняют заблокированными и когда я уничтожаю клиент, сервер показывает сообщения, которые он получил (у меня есть printf сразу после чтения вызовов сервера).

Я пробую его, отправляют и recv (оба с 0 флагами) вместо чтения и записи, и это не изменилось.

1
ответ дан 2 December 2019 в 05:42
поделиться

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

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

1
ответ дан 2 December 2019 в 05:42
поделиться

Вы попробовали его? Похоже, что это должно работать, когда Вы на самом деле вставляете код, где обозначено

0
ответ дан 2 December 2019 в 05:42
поделиться
Другие вопросы по тегам:

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