Comments (17)
在所有的事件回调(如:@onopen、@OnMessage)中,都会带有Session类的参数,用它的sendText()即可发送字符串信息到client.
from netty-websocket-spring-boot-starter.
这种方式需要client触发,触发特定事件,比如创建http连接,发送文本,发送二进制流等等,服务端才能 session.sendText("xxx"),有没有一种方式服务端主动下发数据到client?
from netty-websocket-spring-boot-starter.
这种方式需要client触发,触发特定事件,比如创建http连接,发送文本,发送二进制流等等,服务端才能 session.sendText("xxx"),有没有一种方式服务端主动下发数据到client?
你可以在创建连接时把Seesion存下来,之后在你想要发的时候再session.sendText("xxx")即可
from netty-websocket-spring-boot-starter.
session放集中式缓存么?redis?还是本地缓存,放在本地分布式系统下会有问题
from netty-websocket-spring-boot-starter.
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.
分布式解决方案考虑集成么?
from netty-websocket-spring-boot-starter.
分布式解决方案考虑集成么?
这个框架的定位是一个轻量级的框架,所以并不考虑集成更多的功能来是他变得大而全.
如果需要做成分布式应用,下面的思路也许是一种简单的解决方案
需要:
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.
分布式解决方案考虑集成么?
这个框架的定位是一个轻量级的框架,所以并不考虑集成更多的功能来是他变得大而全.
如果需要做成分布式应用,下面的思路也许是一种简单的解决方案
需要:
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.
onClose() 方法也不能传参啊,当客户端关闭连接时无法知道是哪个用户断掉的,如果我在Map中存储userId和对应的session,现在好像只能定时去检测session是否存活而移除Map中的已经关闭的数据,能否在关闭连接时支持传参呢?
from netty-websocket-spring-boot-starter.
或者说能否可以再路径上传可变参数,类似这种
@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.
onClose() 方法也不能传参啊,当客户端关闭连接时无法知道是哪个用户断掉的,如果我在Map中存储userId和对应的session,现在好像只能定时去检测session是否存活而移除Map中的已经关闭的数据,能否在关闭连接时支持传参呢?
1.在websocket中,关闭操作实际上就是只是发送一个“关闭”操作帧告知对方要关闭而已. 简单点的理解,你在前端的WebSocket对象中调用close() ,就会发现,根本不能传参.
2.如果希望在url上传参,在连接的时候是可以的,关闭的时候是不行的,这不是http请求.你可以想象下,连接的时候你是通过请求一个url,但关闭的时候,你是通过发起另一个请求来关闭这个连接吗?
from netty-websocket-spring-boot-starter.
第一点是对的,但是第二点有点疑问,因为连接的时候url固定了,关闭的时候应该也是传的这个url吧?
我这边用spring-boot-starter-websocket 的试过关闭可以得到这个sid的,但是这边的原理我并是很懂,所以提出这个疑问。
from netty-websocket-spring-boot-starter.
第一点是对的,但是第二点有点疑问,因为连接的时候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.
第一点是对的,但是第二点有点疑问,因为连接的时候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.
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.
第一点是对的,但是第二点有点疑问,因为连接的时候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.
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)
- 支持注册到nacos上吗 HOT 1
- BeforeHandshake关闭session后,nginx转发http响应的502 HOT 2
- 想问下服务器如何判断客户端掉线,然后通知他的好友 HOT 2
- writerIdleTimeSeconds配置使用${引用nacos配置},不能做到动态刷新 HOT 1
- 整合RocketMq后异常日志不全 HOT 2
- netty默认的Channel的通道id太长了,目前框架上支持这个id自定义吗? HOT 1
- 客户端断网后服务端不知道客户端断开了 HOT 1
- 请问如何处理数据库存储的客户端连接状态,假如单节点部署,重启过程中客户端离线,数据库的状态如何改变呢,有什么策略可以主动ping客户端吗 HOT 1
- 想问一下0.12版本客户端访问问题 HOT 1
- 使用@ServerEndpoint修饰但不用@Component时,其它Bean注入该Bean时会报 bean could not be found 异常 HOT 2
- 客户端在线,服务端离线 HOT 1
- 是否支持socketjs+stomp? HOT 1
- 连接报错,发送消息也报错。。。看内容吧。。。 HOT 3
- 能否支持自定义全局异常处理? HOT 1
- 能否进一步优化反射方法性能 HOT 1
- 0.12.0使用的netty版本和文档不一致 HOT 2
- 支持TCP吗?
- pojoClazz 不是单例的吗
- 不支持jdk17么?
- 支持SpringBoot3.2吗 HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from netty-websocket-spring-boot-starter.