封装netty 一个webSocket即时聊天的Im服务器springboot 启动器

封装netty 一个webSocket即时聊天的Im服务器springboot 启动器

只需要几步就可自己创建一个im聊天服务器

  • 引入依赖(需要本地安装 jar包在github

            <dependency>
          <groupId>com.pps.im</groupId>
          <artifactId>springboot-netty-im-pps-starter</artifactId>
          <version>1.0-SNAPSHOT</version>
          <exclusions>
              <exclusion>
                  <artifactId>netty-all</artifactId>
                  <groupId>io.netty</groupId>
              </exclusion>
          </exclusions>
      </dependency>
      <dependency>
          <groupId>io.netty</groupId>
          <artifactId>netty-all</artifactId>
          <version>4.1.45.Final</version>
      </dependency>
    
  • 配置文件

    pps:
      netty:
        im:
          enable : true
          port: 9090
          websocketPath: /pps
    
  • 自定义两个类(必须)

    • webscoket连接权限自定义实现 并加入容器 这个类能决定客户端传入的连接请求能否被允许 客户端可以在连接url后面添加参数 在方法的map里会封装这些参数
      例如:
    @Component
    public class WebConnetionAuth extends WebSocketConnetion {
    
       public WebConnetionAuth() {
           super("/pps");
       }
    
       public WebConnetionAuth(String wsUrl) {
           super(wsUrl);
       }
    
       @Override
       public Boolean webSocketCanConnetion(Map<String, Object> requestParams, ChannelHandlerContext ctx) {
    
    
          return  true;
    
       }
    
       @Override
       public void customOpreate(ChannelHandlerContext ctx) {
    
       }
    }
    
    • 自定义监听事件 例如:
    @Component
    public class CustomListener implements SocketAutoListenr {
    
    
    
    
        @Override
        public void loginSuccessful(SocketEnvent socketEnvent) {
    
            System.out.println("登录");
    
        }
    
        @Override
        public void loginFail(SocketEnvent socketEnvent) {
    
            System.out.println("登陆失败");
    
        }
    
        @Override
        public void loginOut(SocketEnvent socketEnvent) {
    
    
            System.out.println("用户退出:");
    
    
        }
    
        @Override
        public void acceptText(ChannelHandlerContext content, ChatFromProtocl chatFromProtocl, Date happenTime) {
    
            System.out.println("服务器收到信息:");
            System.out.println("消息类型:"+chatFromProtocl.getMsgType());
            System.out.println("消息内容:"+chatFromProtocl.getData());
            int action = chatFromProtocl.getAction();
            MsgAction actionByType = MsgAction.getActionByType(action);
            System.out.print("发送者希望动作:"+ actionByType);
            switch (actionByType){
                case sendToSingle:
                    String to = chatFromProtocl.getTo();
                    if(true){
    
    
    
                    }else {
                        boolean existsUser=false;
                        //todo 如果用户存在 只是不在线 可以离线保存 上线时再发送
                       if(existsUser){
    
    
                        }else {//todo 如果用户不存在
    
    
    
                        }
    
    
                    }
    
                    break;
                case sendToAll:
    
                    break;
                case other:
    
                    break;
                default:
                    SendMsgUtil.sendMsgToClientForErrorInfo(content,"不支持该动作!");
            }
        }
    
        @Override
        public void acceptBin(ChannelHandlerContext content, CharSequence fileInfo, ByteBuf fileData, Date happenTime) {
            System.out.println("服务器收到二进制消息:文件信息:"+fileInfo);
            Map map = JSON.parseObject(String.valueOf(fileInfo), Map.class);
    
    
        }
    
        @Override
        public void other(SocketEnvent socketEnvent) {
    
    
        }
    
  • 可选的http服务 继承HttpService 并加入容器(LoginImService也是继承了httpService) 例如

    @Component
    public class MyLoginServiseImpl extends LoginImService {
      public MyLoginServiseImpl() {
          super("/login");
      }
      public MyLoginServiseImpl(String url) {
          super(url);
      }
      @Override
      public Object validUser(Map<String, Object> requestParams, ChannelHandlerContext ctx) {
          String username = (String) requestParams.get("username");
          String password = (String) requestParams.get("password");
          if("123".equals(password)){
            return "ppppppp";
          }
          return null;
      }
    }
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中,你可以使用Embedded Tomcat作为Web服务器,并且使用Spring WebSocket来实现WebSocket通信。在Netty中,你可以使用Netty WebSocket来实现WebSocket通信。 要将它们监听同一个端口号,你可以使用Spring Boot的嵌入式Netty服务器来替换Embedded Tomcat。这样,你就可以使用Netty WebSocket来实现WebSocket通信,并且监听相同的端口号。 以下是示例代码: 首先,在Spring Boot中添加以下依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.22.Final</version> </dependency> ``` 然后,在你的Spring Boot应用程序中,创建一个新的WebSocket配置,并在其中注册Netty WebSocket: ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new NettyWebSocketHandler(), "/websocket") .setAllowedOrigins("*") .withSockJS(); } } ``` 在上面的代码中,我们将Netty WebSocket注册到路径“/websocket”上,并启用SockJS支持。此外,我们还设置了跨域请求的允许来源。 最后,在你的主应用程序中,添加以下代码来配置嵌入式Netty服务器: ```java @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } @Bean public NettyServerCustomizer nettyServerCustomizer() { return server -> { server.httpPort(8080); server.tcpConfiguration(tcp -> tcp.bootstrap(serverBootstrap -> { serverBootstrap.localAddress(new InetSocketAddress(8080)); }) ); }; } } ``` 在上面的代码中,我们创建了一个NettyServerCustomizer Bean,并使用它来配置嵌入式Netty服务器的监听端口。我们还配置了TCP参数,以便Netty WebSocket可以在相同的端口上进行通信。 现在,你可以使用Spring Boot和Netty WebSocket来监听同一个端口号了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值