Страницы

Поиск по вопросам

Показаны сообщения с ярлыком netty. Показать все сообщения
Показаны сообщения с ярлыком netty. Показать все сообщения

пятница, 24 января 2020 г.

получение коннектов в Netty

#java #netty


Перед тем как написать сюда были предприняты попытки узнать все это у googla, но
нечего путного он не выдает, на сайте библиотеки с инфой скудно.

Как на сервере можно получить коннект клиента, чтобы потом с ним работать в отдельных
потоках? В old I/O это можно было сделать при помощи serverSocket.accept()
    


Ответы

Ответ 1



Коннект клиента можно получить следующим образом: на сервере создается handler и переопределяются нужные методы например channelActive в этот handler можно передать то куда будут складываться коннекты и при удачном подключении вызовется channelActive и в нем можно будет вытащить из ChannelHandlerContext коннект(Channel). @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { server.channel = ctx.channel(); } Дальше channel предоставляет возможность отправки и получения сообщений, но просто так отправить строку или набор байтов не выйдет(у меня не получилось), для этого нужно использовать ByteBuf. ByteBuf buf = channel.alloc().buffer(); buf.writeBytes("message".getBytes()); chanel.pipeline().writeAndFlush(buf); P.S надеюсь кому нибудь это пригодится.

среда, 27 ноября 2019 г.

Странное поведение при наследовании от ChannelInboundHandlerAdapter в netty

#java #ооп #netty


Есть класс наследуемый от ChannelInboundHandlerAdapter, где переопределяю нужные
методы. Например, channelUnregistered:

public abstract class HttpServerHandler extends ChannelInboundHandlerAdapter{

    @Override
    public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
        super. channelUnregistered(ctx);
        // something doing here
    }
    [...]
}


Если использую этот класс, то channelUnregistered срабатывает, когда закрывается
соединение с клиентом.

Но если я от него унаследуюсь:

public abstract class HttpsServerHandler extends HttpServerHandler {

}


При использовании этого класс channelUnregistered никогда не срабатывает. Но если
переопределю этот метод и просто вызову метод из super класса, то всё работает:

public abstract class HttpsServerHandler extends HttpServerHandler {

    @Override
    public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
        super. channelUnregistered(ctx);
    }
}


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


Ответы

Ответ 1



У netty есть класс ServerBootstrap, которому в настройках необходимо задать конфигурацию сервера. Одна из необходимых настроек вызывается функцией childHandler(), в которую передается объект типа ChannelHandler, обязанный контролировать запросы канала. Таким образом для каждого нового соединения создается объект ChannelHandler, который вы привязали ранее при помощи childHandler(). Однако ваши классы объявлены абстрактными и, очевидно, их экземпляры нигде не создаются. Если Вы "привяжете" HttpsServerHandler к своему серверу, то все должно работать.

пятница, 12 июля 2019 г.

Netty Java отправка сообщений клиенту в виде объектов

Как мне в netty отправить объект с помощью MessageToByteEncoder? Если можно приведите пример кода Эхо сервера то есть мы получаем объект и отслыаем обратно.


Ответ

Пример с ObjectEncoder, наследником MessageToByteEncoder
Person.java
public class Person implements Serializable { private final Long id; private String name;
public Person(Long id, String name) { this.id = id; this.name = name; }
public Long getId() { return id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String toString() { return getName(); } }
SimpleClient.java
public class SimpleClient { public static void main(String[] args) throws Exception { EventLoopGroup group = new NioEventLoopGroup(); try { new Bootstrap().group(group) .channel(NioSocketChannel.class) .handler(new ChannelInitializer() { @Override public void initChannel(SocketChannel socketChannel) { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new ObjectEncoder()); pipeline.addLast(new ObjectDecoder(ClassResolvers.cacheDisabled(null))); pipeline.addLast(new ChannelInboundHandlerAdapter() { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { ctx.writeAndFlush(new Person(1L, "John")); }
@Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { Person person = (Person) msg; System.out.println(person); } }); } }) .connect("localhost", 1234) .sync() .channel() .closeFuture() .sync();
} finally { group.shutdownGracefully(); } } }
SimpleServer.java
public class SimpleServer { public static void main(String[] args) throws Exception { EventLoopGroup group = new NioEventLoopGroup(); try { new ServerBootstrap().group(group) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer() { @Override public void initChannel(SocketChannel socketChannel) { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new ObjectEncoder()); pipeline.addLast(new ObjectDecoder(ClassResolvers.cacheDisabled(null))); pipeline.addLast(new ChannelInboundHandlerAdapter() { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { Person person = (Person) msg; System.out.println(person);
person.setName("John Doe"); ctx.writeAndFlush(person) .addListener(ChannelFutureListener.CLOSE); }
@Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { cause.printStackTrace(); ctx.channel().close(); } }); } }) .bind("localhost", 1234) .sync() .channel() .closeFuture() .syncUninterruptibly();
} finally { group.shutdownGracefully(); } } }

вторник, 19 марта 2019 г.

получение коннектов в Netty

Перед тем как написать сюда были предприняты попытки узнать все это у googla, но нечего путного он не выдает, на сайте библиотеки с инфой скудно.
Как на сервере можно получить коннект клиента, чтобы потом с ним работать в отдельных потоках? В old I/O это можно было сделать при помощи serverSocket.accept()


Ответ

Коннект клиента можно получить следующим образом: на сервере создается handler и переопределяются нужные методы например channelActive в этот handler можно передать то куда будут складываться коннекты и при удачном подключении вызовется channelActive и в нем можно будет вытащить из ChannelHandlerContext коннект(Channel).
@Override public void channelActive(ChannelHandlerContext ctx) throws Exception { server.channel = ctx.channel(); }
Дальше channel предоставляет возможность отправки и получения сообщений, но просто так отправить строку или набор байтов не выйдет(у меня не получилось), для этого нужно использовать ByteBuf
ByteBuf buf = channel.alloc().buffer(); buf.writeBytes("message".getBytes()); chanel.pipeline().writeAndFlush(buf);
P.S надеюсь кому нибудь это пригодится.