java nio socket长连接_netty学习实战—实现websocket长连接和socket之间进程通信

netty学习—实现websocket长连接和socket之间通信

最近正在学习netty,跟着教程写了一个基于WebSocket的网页聊天室,对netty有了一定的了解,现在正好项目使用到长连接,选用了netty。

项目目标:客户端A(网页)和服务端通过WebSocket进行通信,客户端B和服务端通过Socket通信,把客户端B的数据传输到客户端A,桥梁为服务端

Socket服务端监听8090端口,长连接服务端监听8089端口,客户端A连接到8089端口,客户端B连接到8090端口

7fe2738633896e29ba7e02c1f8406df1.png

由于是需要对两个端口数据进行不同处理,所以我们创建两个ServerBootstrap,分别绑定两个端口,一个ServerGzhBootstrap处理客户端B和服务端的socket通信;ServerWxQBootstrap处理客户端A和服务端之间的WebSocket长连接通信

ServerInitializer,实现ChannelInitializer,负责初始化客户端B和服务端通信的处理器Handler

WebSocketChannelInitializer,实现ChannelInitializer,负责初始化客户端A和服务端长连接通信的处理器Handler

ServerInitializer添加一个自定义SimpleChannelInboundHandler负责处理客户端B和服务端socket通信

WebSocketChannelInitializer添加一个自定义SimpleChannelInboundHandler负责处理客户端A和服务端WebSocket长连接通信

网页聊天室作为客户端A,客户端B通过Socket通信并接收控制台的输入作为通信数据传递给服务端,服务端再传递给客户端A

问题:

netty中SimpleChannelInboundHandler类的泛型中指定了传入的消息的类型,只能接收这种类型的消息,客户端B发送的String类型消息与客户端A接收的TextWebSocketFrame类型不同,客户端A无法接收。

解决方法:

我们把客户端B发送的String类型消息在Socket服务端接收到,要将其发送给客户端A(需要将其封装成TextWebSocketFrame类型才能发送给客户端A),而且我们就必须要有客户端A的channel,我们才可以调用writeAndFlush方法把数据写入客户端A

使用什么可以得到客户端A的channel呢?

那就是ChannelGroup,我们定义一个类保存全部Channel客户端作为全局ChannelGroup,每次有客户端Channel创建(handlerAdded方法),我们就把它保存到该全局ChannelGroup中,每次channel使用完毕,ChannelGroup会为我们自动删除其中无用的channel,这样我们就可以获取所有的客户端channel

任何获取到客户端A的channel?

客户端A和客户端B很大一个区别就是端口号,我们可以通过端口号来判断是客户端A还是客户端B

全局ChannelGroup

public class GlobalChannelGroup {

public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

}

服务端

服务端启动器

public class Server {

public static void main(String[] args) throws InterruptedException { <

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值