2010-01-18 3 views
3

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

public class MainServer { 

static Socket client = null; 
static ServerSocket server = null; 



public static void main(String[] args) { 
    System.out.println("Server is starting..."); 
    System.out.println("Server is listening..."); 

    try { 
     server = new ServerSocket(5050); 
    } catch (IOException ex) { 
     System.out.println("Could not listen on port 5050"); 
     System.exit(-1); 

    } 
    try { 
     boolean done = false; 
     while (!done) { 

      client = server.accept(); 
      System.out.println("Client Connected..."); 
      BufferedReader streamIn = new BufferedReader(new InputStreamReader(client.getInputStream())); 
      PrintWriter streamOut = new PrintWriter(client.getOutputStream(),true); 
      String line = streamIn.readLine(); 
      if (line.equalsIgnoreCase("bye")) { 
       streamIn.close(); 
       client.close(); 
       server.close(); 
       done = true; 
      } else { 
       System.out.println(line); 
       streamOut.println(line); 
      } 
     } 

    } catch (IOException e) { 
     System.out.println("IO Error in streams " + e); 
    } 
}} 
+0

Я говорю о вашем предыдущем вопросе о том, как клиент разговаривает с сервером ... Кажется, у вас проблемы с домашней работой. Постарайтесь сделать это шаг за шагом. 1) клиентское сообщение для сервера (кнопка клиента нажата) 2) сервер отправляет сообщение клиенту (проверяйте его как эхо на клиент, который что-то посылает ... это в коде, обрабатывающем клиентский клиент-> сервер, сохранить строку и отправить ее клиенту). 3) Когда 1 и 2 работают, попробуйте отправить между двумя разными клиентами. – helios

+0

Предположительно, каждый клиент подключается к серверу через сокет, чтобы вы могли иметь карту на своем сервере, которая сопоставляет имя или что-то в соответствующем сокете. Если вы отправляете сообщение от клиента на сервер, определите формат (например: target_client (\ n) сообщение (\ n), что-то простое начало) – helios

+0

@Johanna: Пожалуйста, начните смотреть ** предварительный просмотр ** при записи/редактировании ваши сообщения. Одиночные разрывы не влияют. Вот почему ваше сообщение отображается без какого-либо формата ... –

ответ

3

Вот и все ваши два «клиента» будут действовать как клиент и сервер: Прослушивание входящих вещей в сокете и отправка вещей по другим сокетам.

+0

Так что ему не нужно устанавливать сервер socket для отправки текста клиенту? Я имею в виду клиент. Отправить текст на сервер, и сервер должен отправить этот текст клиентуB, сервер должен знать, какой клиент. – Johanna

2

На сервере вы можете сохранить набор всех клиентов, которые в настоящее время подключены к серверу. Сервер должен прослушивать сообщения (может делать это с помощью ServerSocket, а клиенты соединяются с обычным Sockets). Каждый раз, когда сервер получает сообщение, он отправляет это сообщение всем клиентам в Set, и клиенты отображают это сообщение.

EDIT: Это для клиент-серверной системы, где клиенты подключаются к центральному серверу, а не напрямую друг к другу. Если вы хотите сделать прямой клиент-клиент, один из них просто должен будет действовать как сервер, и вам нужно будет реализовать пользовательский интерфейс чата в обоих.

0

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

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

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

Это кажется простым в теории, но на практике это усложняется. Например, что, если клиент, с которым вы хотите подключиться, находится за брандмауэром? У вас может быть отверстие в брандмауэре для входящих подключений, чтобы пройти, или вы можете вернуться к тому, что сообщение пройдет через сервер, или если один из клиентов находится за брандмауэром, а другой нет, сервер может оповестить соединение в противоположном направлении.

+0

Bonjour тривиально прост с jmdns. –

+0

@ Thorbjørn - Раньше я ничего не делал с Bonjour, но вы должны опубликовать это как ответ, хотя, если считаете, что это имеет смысл для того, что он делает. –

0

В принципе, есть два подхода:

  1. Один сервер Чат, который принимает все сообщения и распределяет/пересылает их клиентов (XMPP/трескотня работает таким образом)
  2. один сервер, который соединяет клиентов непосредственно. Подобно одноранговым сетям

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

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

Остальное довольно просто: клиент может отправить новое сообщение чата, сервер подберет его и отправит его всем подключенным клиентам.

Если клиент отключается, рабочий поток закрывает сокет, возвращает его в пул и завершает работу.

Смежные вопросы