GithubHelp home page GithubHelp logo

yeautyye / netty-websocket-spring-boot-starter Goto Github PK

View Code? Open in Web Editor NEW
1.7K 58.0 525.0 151 KB

:rocket: lightweight high-performance WebSocket framework ( 轻量级、高性能的WebSocket框架)

License: Apache License 2.0

Java 100.00%
spring-boot netty netty-spring-boot-starter spring-boot-starter annotation im chat asynchronous websocket spring-boot-websocket

netty-websocket-spring-boot-starter's Issues

域名连接失败

之前本地测试的时候是ip连接,可以正常了解,现在发布外网,连接的是域名地址,连接失败,这个需要怎么配置支持吗?

压缩设置逻辑 问题

压缩逻辑的位置应该跟pipeline.addLast(new HttpServerHandler(pojoEndpointServer, config)); 平行.


            .childHandler(new ChannelInitializer<NioSocketChannel>() {
                    @Override
                    protected void initChannel(NioSocketChannel ch) throws Exception {
                        ChannelPipeline pipeline = ch.pipeline();
                        pipeline.addLast(new HttpServerCodec());
                        pipeline.addLast(new HttpObjectAggregator(65536));
                        if (config.isUseCompressionHandler()) {
                            pipeline.addLast(new WebSocketServerCompressionHandler());
                        }
                        pipeline.addLast(new HttpServerHandler(pojoEndpointServer, config));
                    }
                });

咨询一下,要做两个人PK的答题游戏能实现吗

您好,我现在要做两个人PK的答题游戏,大致流程如下
1、登录系统,标识为所有登录的人是在线的
2、某用户发起PK游戏,建立房间,给在线用户发起消息,最先进入的人与发起者进行游戏
3、系统推送题目给在同一房间的两个人,进行PK,相互推送答题结果

后台设置了https 前端请求用wss无响应 后台无报错

image
前端请求
socket = new WebSocket("wss://127.0.0.1:80/ws?userId=admin"); 会报错
但是socket = new WebSocket("ws://127.0.0.1:80/ws?userId=admin"); 不会报错 正常连接
我的理解https对应wss是不是理解错了?

后台必须是要https才能访问的
2018-12-03 23:07:47.280 DEBUG 46804 --- [ntLoopGroup-2-1] io.netty.handler.logging.LoggingHandler : [id: 0xeb16011e, L:/127.0.0.1:80] READ: [id: 0x8059199d, L:/127.0.0.1:80 - R:/127.0.0.1:56556]
2018-12-03 23:07:47.281 DEBUG 46804 --- [ntLoopGroup-2-1] io.netty.handler.logging.LoggingHandler : [id: 0xeb16011e, L:/127.0.0.1:80] READ COMPLETE
2018-12-03 23:07:47.312 DEBUG 46804 --- [ntLoopGroup-2-1] io.netty.handler.logging.LoggingHandler : [id: 0xeb16011e, L:/127.0.0.1:80] READ: [id: 0x4e0e326c, L:/127.0.0.1:80 - R:/127.0.0.1:56557]
2018-12-03 23:07:47.312 DEBUG 46804 --- [ntLoopGroup-2-1] io.netty.handler.logging.LoggingHandler : [id: 0xeb16011e, L:/127.0.0.1:80] READ COMPLETE

部署至阿里云服务器时出现的问题

maven打包时,@serverendpoint的host属性如果直接设置阿里云服务器公网ip,无法打包。

当我将host设置为0.0.0.0时,打包正常,客户端也能正常获取到推送的数据,但是会报一个远程主机强迫关闭了一个现有的连接。

2019-04-11 16:11:44.523 [nioEventLoopGroup-3-2] ERROR org.yeauty.pojo.PojoEndpointServer - Unexpected exception:
java.lang.NullPointerException: null
at sun.reflect.GeneratedMethodAccessor90.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.yeauty.pojo.PojoEndpointServer.doOnError(PojoEndpointServer.java:134)
at org.yeauty.standard.HttpServerHandler.exceptionCaught(HttpServerHandler.java:96)
at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:285)
at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:264)
at io.netty.channel.AbstractChannelHandlerContext.fireExceptionCaught(AbstractChannelHandlerContext.java:256)
at io.netty.channel.ChannelInboundHandlerAdapter.exceptionCaught(ChannelInboundHandlerAdapter.java:131)
at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:285)
at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:264)
at io.netty.channel.AbstractChannelHandlerContext.fireExceptionCaught(AbstractChannelHandlerContext.java:256)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireExceptionCaught(CombinedChannelDuplexHandler.java:426)
at io.netty.channel.ChannelHandlerAdapter.exceptionCaught(ChannelHandlerAdapter.java:87)
at io.netty.channel.CombinedChannelDuplexHandler$1.fireExceptionCaught(CombinedChannelDuplexHandler.java:147)
at io.netty.channel.ChannelInboundHandlerAdapter.exceptionCaught(ChannelInboundHandlerAdapter.java:131)
at io.netty.channel.CombinedChannelDuplexHandler.exceptionCaught(CombinedChannelDuplexHandler.java:233)
at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:285)
at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:264)
at io.netty.channel.AbstractChannelHandlerContext.fireExceptionCaught(AbstractChannelHandlerContext.java:256)
at io.netty.channel.DefaultChannelPipeline$HeadContext.exceptionCaught(DefaultChannelPipeline.java:1401)
at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:285)
at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:264)
at io.netty.channel.DefaultChannelPipeline.fireExceptionCaught(DefaultChannelPipeline.java:953)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.handleReadException(AbstractNioByteChannel.java:125)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:174)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:628)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:563)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:480)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:442)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Unknown Source)
2019-04-11 16:11:44.807 [nioEventLoopGroup-3-3] ERROR org.yeauty.pojo.PojoEndpointServer - Unexpected exception:
java.io.IOException: 远程主机强迫关闭了一个现有的连接。
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(Unknown Source)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source)
at sun.nio.ch.IOUtil.read(Unknown Source)
at sun.nio.ch.SocketChannelImpl.read(Unknown Source)
at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:288)
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1108)
at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:347)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:628)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:563)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:480)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:442)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Unknown Source)

项目部分附件如下
test.zip

@onOpen注解会和aspectj注解冲突吗?

我添加了一个切面,代码如下:

@Aspect
@Component
public class ServiceLogAspect {
    @Around("execution(* com.test.server.WebSocketServer.onOpen(..))")
    public Object around(ProceedingJoinPoint jp) throws Throwable {
        Object result;
        System.out.println("around");
        try {
            result = jp.proceed();
            return result;
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return null;
}
@OnOpen
public void onOpen(Session session, HttpHeaders headers, ParameterMap parameterMap) throws IOException {
        System.out.println("session:" + session + ", new connection"); // not executed

@OnMessage
public void OnMessage(Session session, String message) {
        System.out.println("session:" + session + ", message:" + message);
}

添加这个切面之后,@onopen函数就不触发了,around-advice中的代码也不会执行;但如果把切面中的onOpen函数换成onMessage函数则一切正常,around-advice中的代码也能够执行。

这是因为@onopen注解和aspectj注解有冲突吗?

client在连接server后报Connection reset by peer

client在连接server的事件后,很快会触发一次异常,具体信息为【Connection reset by peer 】,server 端的连接处理并没有什么报错,难道是client的异常或者处理顺序导致的?求助~

wildcard support

Hello,
is it possible to make path wildard I tried:
path =/**
I tried it like this but instead of wildcard it only allows me to create connection uwint path:
new WebSocket("ws://127.0.0.1:8085/**"); //javascript
new WebSocket("ws://127.0.0.1:8085/something/something /asd");//javascript this douesnt work

but it deonst work as expected

Thanks

session 对象不能序列化吗?

我想在连接开启的时候把session 和 用户token 做一个redis键值对保存。方便业务里面使用。但是session 没有提供序列化

正常启动Application类 然后报错--

您好:大神能帮看下吗,为啥
启动报:
java.lang.IllegalStateException: Failed to register ServerEndpointConfig: org.yeauty.standard.ServerEndpointConfig@4047d2d9
y 4mmo wjfx6geci7 1 krj

关闭WebSocket

文档中只说明了如何开始,没有说明如何关闭啊!

@ServerEndpoint 设置端口后报403 不设置端口使用默认80端口正常

@serverendpoint(value = "/ws", host = "127.0.0.1", port = 3000)
前端访问响应403,后台无任何错误
启动日志:
2018-12-03 22:18:23.076 DEBUG 36760 --- [ntLoopGroup-2-1] io.netty.handler.logging.LoggingHandler : [id: 0x934e13e6] REGISTERED
2018-12-03 22:18:23.076 DEBUG 36760 --- [ntLoopGroup-2-1] io.netty.handler.logging.LoggingHandler : [id: 0x934e13e6] BIND: /127.0.0.1:3000
2018-12-03 22:18:23.080 DEBUG 36760 --- [ntLoopGroup-2-1] io.netty.handler.logging.LoggingHandler : [id: 0x934e13e6, L:/127.0.0.1:3000] ACTIVE
前端访问后响应403
GET ws://127.0.0.1:3000/ws?userId=2222222222 HTTP/1.1
Host: 127.0.0.1:3000
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
Upgrade: websocket
Origin: file://
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Sec-WebSocket-Key: IbOqN91LFZ1SCO6AVHXl0A==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
image
使用80端口正常连接

Content-length of blob is 0?

The image sended is not displayed in the browser using the following code:

var ws = new WebSocket('ws://127.0.0.1:8080')
ws.binaryType = 'blob'

多端点描述疑惑点

你好,请问下“当地址相同,路径(path)不同时,使用同一个ServerBootstrap实例”,这句话怎么理解?
我的理解是:多@serverendpoint(path = UrlMappingConsts.V1_BOOTSTRAP)路径配置(地址+端口不变)那么他们的session是同一个? 可以这么理解吗

或者说我需要实现这种功能请问下你的框架是否支持?
Tips 我之所以想通过这种方式区分主要目的是能否让业务能单一化在某个类中。

我这边想实现群聊和一对一聊天

我看了问题《一对一发消息应该怎么做》这边我发现貌似没办法通过 "/netty/{userId}" 这种方式把userId获取到对应的变量中去,不支持socket的PathParam注解啊。用“/netty”可以访问,用 "/netty/{userId}"直接报404.

性能

您好,请问做过压测什么的吗,或者有过生产实践没,各方面性能怎么样?

建议把客户端的ping直接拿出来单独监听

private void handleWebSocketFrame(ChannelHandlerContext ctx, WebSocketFrame frame) {
        if (frame instanceof TextWebSocketFrame) {
            pojoEndpointServer.doOnMessage(ctx, frame);
            return;
        }
       // 这里你直接给返回了 建议把此处单独拿出来 以及下面的Pong
        if (frame instanceof PingWebSocketFrame) {
            ctx.writeAndFlush(new PongWebSocketFrame(frame.content().retain()));
            return;
        }
        if (frame instanceof CloseWebSocketFrame) {
            ctx.writeAndFlush(frame.retainedDuplicate()).addListener(ChannelFutureListener.CLOSE);
            return;
        }
        if (frame instanceof BinaryWebSocketFrame) {
            pojoEndpointServer.doOnBinary(ctx, frame);
            return;
        }
        if (frame instanceof PongWebSocketFrame) {
            return;
        }
    }

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.