Coder Social home page Coder Social logo

Comments (6)

violetagg avatar violetagg commented on June 11, 2024 1

If you want to work only with Netty abstraction then you need some changes:

  1. Ensure that you can see the uncompressed data. Change the code
.doOnChannelInit(((connectionObserver, channel, remoteAddress) -> {
    channel.pipeline()
            .addFirst("connect", new ChannelHandler(this.manager));
}))

with moving the handler at the end

.doOnChannelInit(((connectionObserver, channel, remoteAddress) -> {
	Connection.from(channel)
		.addHandlerLast("connect", new ChannelHandler());
}))
  1. Work with Netty web socket API. Change the code
public class ChannelHandler extends SimpleChannelInboundHandler<ByteBuf> {

    @Override
    protected void channelRead0(@NotNull ChannelHandlerContext ctx, @NotNull ByteBuf msg) throws Exception {
        System.out.println(msg.toString(StandardCharsets.UTF_8));
        ctx.fireChannelRead(msg.copy());
    }
}

with handler that manipulates web socket frames

public class ChannelHandler extends SimpleChannelInboundHandler<WebSocketFrame> {

    @Override
    protected void channelRead0(@NotNull ChannelHandlerContext ctx, @NotNull WebSocketFrame msg) throws Exception {
        System.out.println(msg.content().toString(StandardCharsets.UTF_8));
        ctx.fireChannelRead(msg.copy());
    }
}

I'm closing this issue as it feels like this is a question that would be better suited to Gitter or Stack Overflow.

from reactor-netty.

violetagg avatar violetagg commented on June 11, 2024

@AdaMorgan Most probably in the logs you are seeing the compressed content. From the provided logs I can see that the client sends Sec-WebSocket-Extensions: permessage-deflate. Please provide a full reproducible example that we can run and see the problem.

from reactor-netty.

AdaMorgan avatar AdaMorgan commented on June 11, 2024

ok, I hope this is enough. Next, I create a connection via Postman. I have attached the result.

public class ChannelHandler extends SimpleChannelInboundHandler<ByteBuf> {

    @Override
    protected void channelRead0(@NotNull ChannelHandlerContext ctx, @NotNull ByteBuf msg) throws Exception {
        System.out.println(msg.toString(StandardCharsets.UTF_8));
        ctx.fireChannelRead(msg.copy());
    }
}

public class Main {
    public static void main (String[] args) {
            public void run() {
        HttpServer.create()
                .host(this.config.getHost())
                .port(this.config.getPort())
                .protocol(HttpProtocol.HTTP11)
                .doOnChannelInit(((connectionObserver, channel, remoteAddress) -> {
                    channel.pipeline()
                            .addFirst("connect", new ChannelHandler(this.manager));
                }))
                .route(routes -> routes.ws("/chat", (in, out) -> {
                    return in.receive()
                            .publishOn(Schedulers.boundedElastic())
                            .flatMap(socket -> {
                                return out.send(Mono.fromCallable(() -> {
                                    return Unpooled.copiedBuffer("Hello client!", StandardCharsets.UTF_8);
                                }));
                            });
                }))
                .bindUntilJavaShutdown(Duration.ofSeconds(30), null);
    }
    }
}
GET /chat HTTP/1.1
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: R/9dk94SqnkDP5aXBFabLQ==
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Host: localhost:8080


?E��?�3-?_fy?Qa/?�1G?V}-?[tl?�? ?�3-?�~h?Mrj?�)-?vz!?�wl?���?

from reactor-netty.

violetagg avatar violetagg commented on June 11, 2024

@AdaMorgan You are adding the custom ChannelHandler at the beginning of the pipeline where you are still having a compressed data. Instead of this handler you can change, for example, the code above to this one:

...
					return in.receive()
--> decodes ByteBuf to String			.asString()
--> prints to System.out			.doOnNext(System.out::println)
						.publishOn(Schedulers.boundedElastic())
...

from reactor-netty.

AdaMorgan avatar AdaMorgan commented on June 11, 2024

I just can’t read the data through the ChannelHandler? I know that it would be possible to read the data through the 'WebsocketInbound' class, but I was hoping that I would not have to do it this way, since it increases the size of the project, and reading through the 'SimpleChannelInboundHandler' is much more difficult for me easier

from reactor-netty.

AdaMorgan avatar AdaMorgan commented on June 11, 2024

@violetagg Thank you very much, you helped a lot!

from reactor-netty.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.