Как заставить двух клиентов общаться друг с другом? - PullRequest
3 голосов
/ 18 января 2010

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

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);
    }
}}

Ответы [ 6 ]

3 голосов
/ 18 января 2010

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

2 голосов
/ 18 января 2010

Вот очень простая, ~ 100 строка, графический интерфейс пользователя программа чата .

2 голосов
/ 18 января 2010

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

РЕДАКТИРОВАТЬ: это для системы клиент-сервер,где клиенты подключаются к центральному серверу, а не напрямую друг к другу.Если вы хотите сделать прямой клиент-клиент, один из них просто должен будет выступать в роли сервера, и вам нужно будет реализовать пользовательский интерфейс чата в обоих.

0 голосов
/ 18 января 2010

В основном, есть два подхода:

  1. Один сервер чата, который получает все сообщения и распределяет / пересылает их клиентам (xmpp / jabber работает таким образом)
  2. Один сервер, который напрямую соединяет клиентов. Как в одноранговых сетях

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

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

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

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

0 голосов
/ 18 января 2010

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

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

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

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

0 голосов
/ 18 января 2010

Взгляните на Создание системы интернет-чата .

Здесь объясняется, как писать простые клиенты и сервер с Java.

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