Giter Club home page Giter Club logo

Comments (17)

YeautyYE avatar YeautyYE commented on May 22, 2024

在所有的事件回调(如:@onopen@OnMessage)中,都会带有Session类的参数,用它的sendText()即可发送字符串信息到client.

from netty-websocket-spring-boot-starter.

guoeq avatar guoeq commented on May 22, 2024

这种方式需要client触发,触发特定事件,比如创建http连接,发送文本,发送二进制流等等,服务端才能 session.sendText("xxx"),有没有一种方式服务端主动下发数据到client?

from netty-websocket-spring-boot-starter.

YeautyYE avatar YeautyYE commented on May 22, 2024

这种方式需要client触发,触发特定事件,比如创建http连接,发送文本,发送二进制流等等,服务端才能 session.sendText("xxx"),有没有一种方式服务端主动下发数据到client?

你可以在创建连接时把Seesion存下来,之后在你想要发的时候再session.sendText("xxx")即可

from netty-websocket-spring-boot-starter.

guoeq avatar guoeq commented on May 22, 2024

session放集中式缓存么?redis?还是本地缓存,放在本地分布式系统下会有问题

from netty-websocket-spring-boot-starter.

YeautyYE avatar YeautyYE commented on May 22, 2024

session放集中式缓存么?redis?还是本地缓存,放在本地分布式系统下会有问题

websocket的session是有状态的,和http的session不同,没办法像http的session一样直接存在redis中(其实http的session是无状态的,实际上在redis中只是存了一些元数据或者是用户标示).
也就是一个session对应着唯一一条长连接,一个client的一条连接只能连接唯一一个server.
所以即使把session保存在redis中,其实也就是像http的session一样,保存着一些元数据(但这里是需要长连接来进行server对client推送)
那么,如果要做分布式的话,我们需要换种思路.可以是用redis记录着,哪个client连接着哪个server,但我们需要指定的client发送消息时,只需要操作对应的server即可

from netty-websocket-spring-boot-starter.

guoeq avatar guoeq commented on May 22, 2024

分布式解决方案考虑集成么?

from netty-websocket-spring-boot-starter.

YeautyYE avatar YeautyYE commented on May 22, 2024

分布式解决方案考虑集成么?

这个框架的定位是一个轻量级的框架,所以并不考虑集成更多的功能来是他变得大而全.

如果需要做成分布式应用,下面的思路也许是一种简单的解决方案
需要:
redis(memcached) 用来存client唯一标示(如:userId) 和server唯一标示(如: ip)
kafka(rocketmq、rabbitmq) 用于异步通知相应的server发送消息
流程:
1.当client连接时,在redis中存入userId:serverIp,并在当前应用的一个map中添加userId和对应的session
2.当需要对某client发送消息时,先去redis中查出对应的serverIp,通过kafka推送一条消息(topic:serverIp key:userId value:content)
3.当对应的server收到消息时,找到 第 1 步中的map ,把相应的session获取到,调用sendText()方法发送消息
4.当client关闭连接时,把redis中相应的记录删除
tips1:以上是主要的流程,没有提到如server挂掉时,如何把redis中的记录删除,其实有很多解决方案,如加上过期时间 .
tips2:建议通过装饰者模式,将session和上面的部分流程集成起来,以后的调用者会更加的舒服

from netty-websocket-spring-boot-starter.

84yy avatar 84yy commented on May 22, 2024

分布式解决方案考虑集成么?

这个框架的定位是一个轻量级的框架,所以并不考虑集成更多的功能来是他变得大而全.

如果需要做成分布式应用,下面的思路也许是一种简单的解决方案
需要:
redis(memcached) 用来存client唯一标示(如:userId) 和server唯一标示(如: ip)
kafka(rocketmq、rabbitmq) 用于异步通知相应的server发送消息
流程:
1.当client连接时,在redis中存入userId:serverIp,并在当前应用的一个map中添加userId和对应的session
2.当需要对某client发送消息时,先去redis中查出对应的serverIp,通过kafka推送一条消息(topic:serverIp key:userId value:content)
3.当对应的server收到消息时,找到 第 1 步中的map ,把相应的session获取到,调用sendText()方法发送消息
4.当client关闭连接时,把redis中相应的记录删除
tips1:以上是主要的流程,没有提到如server挂掉时,如何把redis中的记录删除,其实有很多解决方案,如加上过期时间 .
tips2:建议通过装饰者模式,将session和上面的部分流程集成起来,以后的调用者会更加的舒服
很棒,谢谢作者

from netty-websocket-spring-boot-starter.

wapmnw avatar wapmnw commented on May 22, 2024

onClose() 方法也不能传参啊,当客户端关闭连接时无法知道是哪个用户断掉的,如果我在Map中存储userId和对应的session,现在好像只能定时去检测session是否存活而移除Map中的已经关闭的数据,能否在关闭连接时支持传参呢?

from netty-websocket-spring-boot-starter.

wapmnw avatar wapmnw commented on May 22, 2024

或者说能否可以再路径上传可变参数,类似这种

@serverendpoint("/websocket/{sid}")
@component
public class WebSocketServer {

/**
 * 连接建立成功调用的方法
 */
@OnOpen
public void onOpen(Session session, @PathParam("sid") String sid) throws Exception {
  
}

/**
 * 连接关闭调用的方法
 */
@OnClose
public void onClose(Session session,@PathParam("sid") String sid) throws Exception {

}

from netty-websocket-spring-boot-starter.

YeautyYE avatar YeautyYE commented on May 22, 2024

onClose() 方法也不能传参啊,当客户端关闭连接时无法知道是哪个用户断掉的,如果我在Map中存储userId和对应的session,现在好像只能定时去检测session是否存活而移除Map中的已经关闭的数据,能否在关闭连接时支持传参呢?

1.在websocket中,关闭操作实际上就是只是发送一个“关闭”操作帧告知对方要关闭而已. 简单点的理解,你在前端的WebSocket对象中调用close() ,就会发现,根本不能传参.
2.如果希望在url上传参,在连接的时候是可以的,关闭的时候是不行的,这不是http请求.你可以想象下,连接的时候你是通过请求一个url,但关闭的时候,你是通过发起另一个请求来关闭这个连接吗?

from netty-websocket-spring-boot-starter.

wapmnw avatar wapmnw commented on May 22, 2024

第一点是对的,但是第二点有点疑问,因为连接的时候url固定了,关闭的时候应该也是传的这个url吧?
我这边用spring-boot-starter-websocket 的试过关闭可以得到这个sid的,但是这边的原理我并是很懂,所以提出这个疑问。

from netty-websocket-spring-boot-starter.

YeautyYE avatar YeautyYE commented on May 22, 2024

第一点是对的,但是第二点有点疑问,因为连接的时候url固定了,关闭的时候应该也是传的这个url吧?
我这边用spring-boot-starter-websocket 的试过关闭可以得到这个sid的,但是这边的原理我并是很懂,所以提出这个疑问。

1.这个sid不是客户端传过来的.最明显的感受就是,用spring-boot-starter-websocket的时候,客户端关闭,你也没有传东西过去,就能得到sid
2.如果你说的这个sid是session的唯一标识,可以通过 session.id() 获取

from netty-websocket-spring-boot-starter.

wapmnw avatar wapmnw commented on May 22, 2024

第一点是对的,但是第二点有点疑问,因为连接的时候url固定了,关闭的时候应该也是传的这个url吧?
我这边用spring-boot-starter-websocket的试过关闭可以得到这个SID的,但是这边的原理我并是很懂,所以提出这个疑问。

1.这个sid不是客户端传过来的。最明显的感受就是,用spring-boot-starter-websocket的时候,客户端关闭,你也没有传东西过去,就能得到sid
2.如果你说的这个sid是session的唯一标识,可以通过session.id()获取

1.我先解释下这个sid并不是session的唯一标识,是我的一个用户的sessionId,用来验证用户是否登录的。
2.sid不是客户端传入,只是说客户端关闭时应该走的和连接一样的url,只是操作指令不一样,而注解@PathParam通过拦截反射取url上的{sid}值

from netty-websocket-spring-boot-starter.

YeautyYE avatar YeautyYE commented on May 22, 2024

1.我先解释下这个sid并不是session的唯一标识,是我的一个用户的sessionId,用来验证用户是否登录的。
2.sid不是客户端传入,只是说客户端关闭时应该走的和连接一样的url,只是操作指令不一样,而注解@PathParam通过拦截反射取url上的{sid}值

其实真是的情况并不是关闭时从url上面拿到,而是连接的时候拿到,只是和session一起关联着存起来了.
在这里也可以进行一样的操作,例子如下

        //设置sid,以下代码只需替换sid的值即可直接使用
        String sid = "sid";
        AttributeKey<String> sessionIdKey = AttributeKey.valueOf("sessionId");
        session.channel().attr(sessionIdKey).set(sid);
        //获取sid
        String sid = session.channel().attr(sessionIdKey).get();

from netty-websocket-spring-boot-starter.

YeautyYE avatar YeautyYE commented on May 22, 2024

第一点是对的,但是第二点有点疑问,因为连接的时候url固定了,关闭的时候应该也是传的这个url吧?
我这边用spring-boot-starter-websocket的试过关闭可以得到这个SID的,但是这边的原理我并是很懂,所以提出这个疑问。

1.这个sid不是客户端传过来的。最明显的感受就是,用spring-boot-starter-websocket的时候,客户端关闭,你也没有传东西过去,就能得到sid
2.如果你说的这个sid是session的唯一标识,可以通过session.id()获取

1.我先解释下这个sid并不是session的唯一标识,是我的一个用户的sessionId,用来验证用户是否登录的。
2.sid不是客户端传入,只是说客户端关闭时应该走的和连接一样的url,只是操作指令不一样,而注解@PathParam通过拦截反射取url上的{sid}值

1.我先解释下这个sid并不是session的唯一标识,是我的一个用户的sessionId,用来验证用户是否登录的。
2.sid不是客户端传入,只是说客户端关闭时应该走的和连接一样的url,只是操作指令不一样,而注解@PathParam通过拦截反射取url上的{sid}值

其实真是的情况并不是关闭时从url上面拿到,而是连接的时候拿到,只是和session一起关联着存起来了.
在这里也可以进行一样的操作,例子如下

        //设置sid,以下代码只需替换sid的值即可直接使用
        String sid = "sid";
        AttributeKey<String> sessionIdKey = AttributeKey.valueOf("sessionId");
        session.channel().attr(sessionIdKey).set(sid);
        //获取sid
        String sid = session.channel().attr(sessionIdKey).get();

或者可以在明天的0.7.5版本中使用如下代码

            String key = "sessionId";
            //设置sid
            session.setAttribute(key,"sid");
            //获取sid
            String sid = session.getAttribute(key);

from netty-websocket-spring-boot-starter.

wapmnw avatar wapmnw commented on May 22, 2024

1.我先解释下这个sid并不是session的唯一标识,是我的一个用户的sessionId,用来验证用户是否登录的。
2.sid不是客户端传入,只是说客户端关闭时应该走的和连接一样的url,只是操作指令不一样,而注解@PathParam通过拦截反射取url上的{sid}值

其实真是的情况并不是关闭时从url上面拿到,而是连接的时候拿到,只是和session一起关联着存起来了.
在这里也可以进行一样的操作,例子如下

        //设置sid,以下代码只需替换sid的值即可直接使用
        String sid = "sid";
        AttributeKey<String> sessionIdKey = AttributeKey.valueOf("sessionId");
        session.channel().attr(sessionIdKey).set(sid);
        //获取sid
        String sid = session.channel().attr(sessionIdKey).get();

明白了,忘了Netty的attr() 方法可以绑定自定义属性了,感谢!

from netty-websocket-spring-boot-starter.

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.