Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Клиент-Сервер конект, Не могу понять как работает оО 
:(
    Опции темы
TwisT_X
  Дата 7.1.2010, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


It's works!
**


Профиль
Группа: Участник
Сообщений: 293
Регистрация: 15.2.2005
Где: Earth

Репутация: нет
Всего: 4



Добрый вечер... 
Писал сервер для игры в шахматы (задание курсовой работы) и столкнулся с непонятной для меня проблемой:

Код

        ServerSocket cs = null;
        Socket player1 = null, player2 = null;
        OutputStream os;
        try {
            cs = new ServerSocket(1988);
        } catch (IOException e) {
            System.out.println("Couldn't listen to port 1988");
            System.exit(-1);
        }
        System.out.println("Waiting for players ...");
        try {
            player1 = cs.accept();
            os = player1.getOutputStream();
            System.out.println("Player #1 connected: " + player1);
            os.write("Wellcome to server of chess. You are the first player.".getBytes());
            player2 = cs.accept();
            System.out.println("Player #2 connected: " + player2);
            os = player2.getOutputStream();
            os.write("Wellcome to server of chess. You are the second player.".getBytes());
        } catch (IOException e) {
            System.out.println("Can't accept");
            System.exit(-1);
        }


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

P.S. если убрать блок try то результат не изменится..


--------------------
Если ты упадешь я буду рядом. (с) Асфальт
PM MAIL WWW   Вверх
jk1
Дата 7.1.2010, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 2
Всего: 75



1) Потоки (Streams) надо закрывать методом close(); после использования. Если поток буферизованный, будет полезно также вызвать flush(); для слива содержимого буфера вызовом native API. 

2) Взаимодействие сервера с несколькими клиентами, как правило, реализуется созданием отдельного потока для работы с каждым из клиентов, например:
Код

public class KKMultiServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = null;
        boolean listening = true;

        try {
            serverSocket = new ServerSocket(4444);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 4444.");
            System.exit(-1);
        }

        while (listening)
        new KKMultiServerThread(serverSocket.accept()).start();

        serverSocket.close();
    }
}

Код

public class KKMultiServerThread extends Thread {
    private Socket socket = null;

    public KKMultiServerThread(Socket socket) {
    super("KKMultiServerThread");
    this.socket = socket;
    }

    public void run() {

    try {
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(
                    new InputStreamReader(
                    socket.getInputStream()));

        // здесь обрабатываете input, результат пишете в output
        out.close();
        in.close();
        socket.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
    }
}



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
TwisT_X
Дата 7.1.2010, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


It's works!
**


Профиль
Группа: Участник
Сообщений: 293
Регистрация: 15.2.2005
Где: Earth

Репутация: нет
Всего: 4



Получается мне надо использовать потоки Thread. Главным будет сам сервак и два дочерних - клиенты.. Я правильно понял?


--------------------
Если ты упадешь я буду рядом. (с) Асфальт
PM MAIL WWW   Вверх
jk1
Дата 7.1.2010, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 2
Всего: 75



Нет. Это все серверные потоки: один основной + по одному для обслуживания каждого клиента


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
TwisT_X
Дата 7.1.2010, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


It's works!
**


Профиль
Группа: Участник
Сообщений: 293
Регистрация: 15.2.2005
Где: Earth

Репутация: нет
Всего: 4



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

Я сейчас буду пробовать... Можно с тобой как-то связаться по ICQ или еще как-то для дальнейшего совета?


--------------------
Если ты упадешь я буду рядом. (с) Асфальт
PM MAIL WWW   Вверх
jk1
Дата 7.1.2010, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 2
Всего: 75



На форуме есть PM. Пиши, если будут еще вопросы по теме.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
alon4ik
Дата 12.1.2010, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 12.9.2009
Где: Харьков

Репутация: нет
Всего: нет



Цитата(TwisT_X @ 7.1.2010,  20:52)
ой так сразу тяжело все впитать... Получается сервер выделяет два дочерних потока для двух сокетов и работает с ними по отдельности?

jk1 достаточно хорошо разъяснил.
Вам необходимо, чтобы в главном потоке сервера создавался сервер-сокет. Если подконнектился клиент - вы в отдельном потоке обрабатываете его запрос и отсылаете ответ (работаете на уровне инпут- и аутпутстримов).
Примеры реализации клиент-серверного взаимодействия посмотрите здесь: серверклиент



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0854 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.