Netty咋保持长连接
正好在查这个资料,写几句话作为备忘。首先建立一个映射关系是必须的。其次客户端肯定有标示,然后服务器端区分的方式如下:如果Netty的版本是4.1、5(5已经被废弃了),那么可以用Channel.id()
来区分,结合了MAC地址,当前PID,时间戳,哈希等多种信息。甚至可以作为全局唯一ID。如果Netty是4.0版本,那么只能使用Channel.toString()
或者使用hashCode(), remoteAddress(), and localAddress()
计算出一个ID。但是这种方式需要特别注意,因为channel在inactive的状态,有些值是会改变的。
■网友
简单一点的话,连接成功后客户端可以发起一个类似注册初始化的请求,服务器端可以将Channel和客户端的标示(设备ID或者玩家ID这类唯一性的东西)存储在MAP中,然后在后续业务中根据标示就可以获取到对应的Channel进行writeAndFlush。即有客户端连接、断开连接时需维护这个MAP
■网友
传统的阻塞socket通信是这样的...
当客户端要与服务端通信,客户端首先要创建一个 Socket 实例,操作系统将为这个 Socket 实例分配一个没有被使用的本地端口号,并创建一个包含本地和远程地址和端口号的套接字数据结构,这个数据结构将一直保存在系统中直到这个连接关闭。当然这之前有一些操作,比如三次握手...
服务端将创建一个 ServerSocket ,操作系统也会为 ServerSocket 实例创建一个底层数据结构,这个数据结构中包含指定监听的端口号和包含监听地址的通配符,通常情况下都是“*”即监听所有地址。之后当调用 accept() 方法时,将进入阻塞状态,等待客户端的请求。当一个新的请求到来时,将为这个连接创建一个新的套接字数据结构,该套接字数据的信息包含的地址和端口信息正是请求源地址和端口。这个新创建的数据结构将会关联到 ServerSocket 实例的一个数据结构列表中,所以 ServerSocket 所关联的列表中每个数据结构,都代表与一个客户端的建立的 TCP 连接。
所以无论io模型怎么变,netty服务端肯定是维护一个客户端连接的数据结构列表...
■网友
深入Netty(1)异步和事件驱动
■网友
这跟netty关系不大,
netty是对nio进行封装,nio就是在单个channel上进行read和write啦,同一个连接,始终就是在这一个channel上你来我回.
也许我是误解题主的意思了?
■网友
每个请求在入口的时候带个Id,一般叫做SeqNr,这个id和某个连接/channel绑定。写的时候按照这个来写出响应即可。
欢迎加入我们团队来哈,dubbo的作者也在我们团队。
https://u.wechat.com/MI2yC1yEpNXk1_7W_wLXHgI (二维码自动识别)
■网友
1. 直接获取socket值就可以了,remoteAddress 一般是唯一的2. 直接保存整个ctx.channel,然后在inboundChannelhandler里对数据发送的ctx进行比对3. 如果需要禁止多重连接,可以从remoteAddress里面抓出一个IP地址出来,同一个IP地址在管理队列里只允许存在一个socket连接4. netty的核心不是并发计算,而是为了解决并发IO的效率问题,不要尝试在netty的框架里面做长连接的并发运算,用一个独立的threadPool+futurePromise做管理。
■网友
比如是http的话,客户端根据url区分不同逻辑,netty接收到http获取url,和方法get,post等,根据这些自定义路由类,将不同url路由到指定方法去执行,每个方法新建一个response,就可以回复了
■网友
可以看下dubbo的实现哦,https://juejin.im/entry/5cf0d372e51d457753138167
就是每个请求都维护一个sessionid。发送给对方,返回的时候再拿这这个sessionid了。
■网友
推荐阅读
- 联通校园宽带限制笔记本发射wifi让其他设备连接,这样做合法吗
- |东风轻量化车身连接试制平台正式投用
- win7中本地连接跟无线网卡同时使用时是怎么样的模式
- 怎么样将家里的液晶电视和笔记本电脑连接
- 让一个网游(或手游)连接自己的服务器或pc
- 选择一款IT资产管理系统(集合硬件资源、归属部门、ip地址、远程连接)等功能
- 摩托车|这才是骑士最该入手的新年礼物。让你一整年保持“机”情!
- 两个网卡不同宽带同时连接外网,或者一个网卡双ip,电脑是怎样选择线路的
- SUV大师|保持初心?还是一成不变?斯巴鲁傲虎不少人说真香!
- 米家温湿度传感器为啥必须要搭配米家网关比直接连接WIFI控制更好吗