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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MINA DemuxTest, Как бы не работает  
:(
    Опции темы
goodday1941
Дата 13.11.2007, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я так понял никто с этим вопросом не разбирался :( ладно буду сам копать, результаты раскопок выложу когда чего-то накопаю smile


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
goodday1941
Дата 14.11.2007, 16:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



И так, представляю вашему вниманию весьма бесполезную программу, которая делает следующее:
1. Клиент соединяется  с сервером.
2. Клиент отправляет 1000 объектов серверу. Сервер, в свою очередь, приняв объект, отсылает всем существующим соединениям данный объект.
3. Клиент разрывает соединение.

Для всего этого понадобиться три библиотеки: mina-core-1.1.4.jar (собственно сам Apache MINA API), slf4j-api-1.4.3.jar, slf4j-simple-1.4.3.jar(библиотеки которые нужны для работы логгера в MINA slf4j).

И так, собственно, сам сервера Server.java:
Код

package Chat;

import java.net.InetSocketAddress;
import java.io.IOException;

import org.apache.mina.common.DefaultIoFilterChainBuilder;
import org.apache.mina.common.IoAcceptor;
import org.apache.mina.common.IoAcceptorConfig;
import org.apache.mina.filter.LoggingFilter;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.nio.SocketAcceptor;
import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;

public class Server {
    private static final int PORT = 1234;

    public static void main(String[] args) throws Exception {
        IoAcceptor acceptor = new SocketAcceptor();
        IoAcceptorConfig config = new SocketAcceptorConfig();
        DefaultIoFilterChainBuilder chain = config.getFilterChain();
        chain.addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
        addLogger(chain);

        try {
            acceptor.bind(new InetSocketAddress(PORT), new ServerHandler(),
                    config);
            System.out.println("Listening on port " + PORT);
        } catch (IOException e) {
            System.out.println("Can`t start server.");
        }
    }

    private static void addLogger(DefaultIoFilterChainBuilder chain)
            throws Exception {
        chain.addLast("logger", new LoggingFilter());
    }
}

Слушатель сессии на сервере ServerHandler.java:

Код

package Chat;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;

public class ServerHandler extends IoHandlerAdapter {
    private Set<IoSession> sessions = Collections
            .synchronizedSet(new HashSet<IoSession>());

    public void exceptionCaught(IoSession session, Throwable cause) {
        session.close();
    }

    public void messageReceived(IoSession session, Object message) {
        for (IoSession s:sessions){
            if (s.isConnected()){
                s.write(message);
            } else {
                sessions.remove(session);
            }
        }
    }

    public void sessionClosed(IoSession session) throws Exception {
        sessions.remove(session);
    }

    public void sessionCreated(IoSession session) throws java.lang.Exception {
        sessions.add(session);
    }
}

Теперь клиентская часть Client.java:

Код

package Chat.client;

import java.net.InetSocketAddress;

import org.apache.mina.transport.socket.nio.SocketConnector;
import Chat.TestObject;

public class Client {
    private ClientSupport client;
    private ClientHandler handler;
    private SocketConnector connector;

    public Client() {
        connector = new SocketConnector();
        if (!connect()){
            System.out.println("Could not connect to localhost:1234. ");
            return;
        }
       for (int i = 0; i< 1000; i++)
        if (!sendMessage(new TestObject(i))){
            System.out.println("Can`t send message: session closed");
        }
        disconnect();
    }

    private void disconnect(){
        try {
            if (client != null){
                client.quit();
            }
        } catch (Exception e1) {
            System.out.println("Session could not be closed.");
        }
    }

    private boolean sendMessage(Object o){
        return client.sendMessage(o);
    }

    private boolean connect(){
        handler = new ClientHandler();
        client = new ClientSupport(handler);
        return client.connect(connector, new InetSocketAddress("localhost", 1234));
    }

    public static void main(String[] args) {
        new Client();
    }
}

Далее, вспомогательный класс, в который вынесено соединение с сервером, отправка сообщений и разрыв соединения с сервером ClientSupport.java:
Код

package Chat.client;

import java.net.SocketAddress;

import org.apache.mina.common.ConnectFuture;
import org.apache.mina.common.IoHandler;
import org.apache.mina.common.IoSession;
import org.apache.mina.transport.socket.nio.SocketConnector;
import org.apache.mina.transport.socket.nio.SocketConnectorConfig;

public class ClientSupport {
    private final IoHandler handler;

    private IoSession session;

    public ClientSupport(IoHandler handler) {
        this.handler = handler;
    }

    public boolean connect(SocketConnector connector, SocketAddress address) {
        if (session != null && session.isConnected()) {
            throw new IllegalStateException(
                    "Already connected. Disconnect first.");
        }
        try {
            SocketConnectorConfig config = new SocketConnectorConfig();
            ConnectFuture future1 = connector.connect(address, handler, config);
            future1.join();
            if (!future1.isConnected()) {
                return false;
            }
            session = future1.getSession();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public boolean sendMessage(Object o) {
        if (session != null && session.isConnected()){
            session.write(o);
            return true;
        } else {
            return false;
        }
    }

    public void quit() {
        if (session != null) {
            session.close();
            if (session.isConnected()) {
                session.getCloseFuture().join();
            }
            System.out.println(session.isClosing() + " " + session.isConnected());
        }
    }
}

И слушатель сессии на клиенте ClientHandler.java:
Код

package Chat.client;

import org.apache.mina.common.IoFilter;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.filter.LoggingFilter;
import Chat.TestObject;

public class ClientHandler extends IoHandlerAdapter {

    public void sessionCreated(IoSession session) throws Exception {
        IoFilter loggingFilter = new LoggingFilter();
        IoFilter codecFilter = new ProtocolCodecFilter(new ObjectSerializationCodecFactory());
        session.getFilterChain().addLast("codec", codecFilter);
        session.getFilterChain().addLast("logger", loggingFilter);
    }

    public void sessionOpened(IoSession session) throws Exception {
        System.out.println("Connected.");
    }

    public void messageReceived(IoSession session, Object message)
            throws Exception {
        if (message instanceof TestObject){
            System.out.println("TestObject resived! " + ((TestObject)message).getN());
        }
    }

    public void sessionClosed(IoSession session) throws Exception {
        System.out.println("Connection closed.");
    }

    public void exceptionCaught(IoSession ioSession, Throwable throwable) throws java.lang.Exception {
        System.out.println("Exception: " + throwable.getMessage());
    }
}

Тестовый обьект TestObject.java:
Код

package Chat;

import java.io.Serializable;

public class TestObject implements Serializable{
    private int n;

    public TestObject(int n) {
        this.n = n;
    }

    public int getN() {
        return n;
    }
}

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

 for (int i = 0; i< 1000; i++)
        if (!sendMessage(new TestObject(i))){
            System.out.println("Can`t send message: session closed");
        }
        disconnect();

в классе Client.java, далее запускаете второго клиента уже с раскомментированым кодом в Client.java. Наблюдаем, что выдает логгер в стектрейс.

В общем, подключив фантазию можно получить что-то похожее на JMS (:.

PS. Все написанное основывается на примере с сайта MINA chat


Это сообщение отредактировал(а) goodday1941 - 14.11.2007, 18:17


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
Platon
Дата 15.11.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

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



Честно сказать не понял к чему это?
PM MAIL ICQ   Вверх
goodday1941
Дата 15.11.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
Platon
Дата 16.11.2007, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

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



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

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

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


 




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


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

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