Q: Обмен данными между двумя клиентами (браузерами) Приветствую. Как осуществить обмен данными: клиент <-> клиент? Возможно ли такое с помощю ajax?

A: Да, это возможно! Но есть детали.
Это не AJAX, конечно (я позволил себе сократить требования до "браузера без плагинов"). Но рядом с ответами про вебсокеты и громкие заявления о том, что это невозможно, считаю нужным возразить.
Если коротко, WebRTC.

Даже для этого потребуется участие сервера (но только в начале!), поскольку клиенты должны узнавать о существовании друг друга.
Через "сигнальный сервер" они объединяются в комнаты и с помощью ICE (Interactive Connectivity Establishment) пытаются подсоединиться друг к другу напрямую, обходя NATы. Потребуется STUN-сервер (чтобы клиент узнавал собственный адрес/порт и мог его объявить), а для безнадёжных случаев, где прямая связь не устанавливается, TURN-шлюз для прокачки пакетов. Последний необязателен, но позволит соединяться в большем числе сценариев.
Означенный сигнальный сервер всего лишь управляет раздачей ICE-предложений (пакетов с информацией о клиентах) в пределах комнаты: клиент заявляет о себе, а сервер рассылает заявление тем, кому нужно о нём знать. Логику, конечно, можно изменить. Популярный способ реализации: NodeJS+socket.io (Websockets + запасные варианты).
Но это:


*

*Поддерживают только достаточно свежие браузеры.

*Не всегда работает и в печальных случаях требует TURN-сервер для прокачки пакетов, когда клиенты неудачно расположены в сети.

*Довольно... непривычный интерфейс после клиент-серверной связи.


A: Upd: Это ответ на первую версию вопроса Ajax обмен Обмен данными между двумя клиентами.
Это невозможно. Ajax предназначен для обмена данными между клиентом и сервером. Также обратите внимание на то, что обмен данными по прежнему остается односторонним и направлен от браузера (клиент) к веб-серверу (сервер). То есть клиент отправляет запрос, а сервер обрабатывает его и отправляет ответ.

AJAX, Ajax
  (ˈeɪdʒæks, от англ. Asynchronous Javascript and XML — «асинхронный JavaScript и XML») — подход к построению интерактивных пользовательских интерфейсов веб-приложений, заключающийся в «фоновом» обмене данными браузера с веб-сервером. В результате, при обновлении данных веб-страница не перезагружается полностью, и веб-приложения становятся быстрее и удобнее.

Двусторонний обмен данными браузер <-> браузер (клиент <-> клиент) можно реализовать используя на клиентской стороне Websockets и сервер который поддерживает Websockets. Серверная реализация Websockets доступна для множества популярных языков программирования. 
Примерный алгоритм работы:


*

*Клиенты соединяются посредством веб-сокетов с сервером.

*Сервер содержит список подключенных клиентов.

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


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

A: Напрямую клиента с клиентом соединить не получится. В любом случае между ними должен быть сервер. Предлагаю посмотреть в сторону Websockets. Пример:
var socket = new WebSocket("ws://javascript.ru/ws");

socket.onopen = function() {
  alert("Соединение установлено.");
};

socket.onclose = function(event) {
  if (event.wasClean) {
    alert('Соединение закрыто чисто');
  } else {
    alert('Обрыв соединения'); // например, "убит" процесс сервера
  }
  alert('Код: ' + event.code + ' причина: ' + event.reason);
};

socket.onmessage = function(event) {
  alert("Получены данные " + event.data);
};

socket.onerror = function(error) {
  alert("Ошибка " + error.message);
};

