目录

pom依赖

Server端

main方法初始化netty

服务端端主动给客户端发送消息


pom依赖

     <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.36.Final</version></dependency>

Server端

package com.kc.monitor.core.utils.netty;import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;import java.net.InetSocketAddress;
import java.util.concurrent.ConcurrentHashMap;public class NettyServer{/** 记录所有客户端连接, key=用户id, value=ChannelHandlerContext */public static ConcurrentHashMap<String, ChannelHandlerContext> userIdMap = new ConcurrentHashMap();/** 记录所有客户端连接, key=客户端地址和端口, value=ChannelHandlerContext */public static ConcurrentHashMap<String, ChannelHandlerContext> remoteAddressMap = new ConcurrentHashMap();/*** netty启动端口号*/public static int port = 8081;public void initServer() {/***  客户端创建两个线程池组分别为 boss线程组和工作线程组*/// boss线程池,用于接受客户端连接的请求 (并没有处理请求)NioEventLoopGroup bossGroup = new NioEventLoopGroup();// work线程池,用于处理客户端连接的读写操作,三个线程NioEventLoopGroup workGroup = new NioEventLoopGroup(3);// 用于创建我们的ServerBootstrapServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(bossGroup, workGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception {// LineBasedFrameDecoder解决粘包-解包问题,设置我们分割最大长度为1024// 原理就是自动帮我们把带有\n或\r\n的数据进行换行//socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024));socketChannel.pipeline().addLast(new StringEncoder());// String编码器socketChannel.pipeline().addLast(new StringDecoder());// String解码器socketChannel.pipeline().addLast(new ServerHandler());// 管道类-接收发送消息}});try {// 绑定端口号,同步等待成功ChannelFuture future = serverBootstrap.bind(port).sync();System.out.println("服务器启动成功:" + port);// 等待服务器监听端口future.channel().closeFuture().sync();System.out.println("关闭服务器");} catch (Exception e) {e.printStackTrace();} finally {// 优雅的关闭连接bossGroup.shutdownGracefully();workGroup.shutdownGracefully();}}}class ServerHandler extends SimpleChannelInboundHandler<String> {@Overrideprotected void channelRead0(ChannelHandlerContext channelHandlerContext, String msg) throws Exception {// msg消息协议格式:id/消息内容String[] split = msg.split("/");NettyServer.userIdMap.put(split[0], channelHandlerContext);System.out.println("接收客户端消息:" + msg);// 响应客户端内容:channelHandlerContext.writeAndFlush("00");InetSocketAddress ipSocket = (InetSocketAddress)channelHandlerContext.channel().remoteAddress();System.out.println("获取客户端ip:" + ipSocket.getAddress().toString());}@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {// remoteAddress = /192.168.52.1:59807String remoteAddress = ctx.channel().remoteAddress().toString();System.out.println("有客户端连接... 客户端地址" + remoteAddress);NettyServer.remoteAddressMap.put(remoteAddress, ctx);super.channelActive(ctx);}@Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {String remoteAddress = ctx.channel().remoteAddress().toString();System.out.println("有客户端断开连接... " + remoteAddress);NettyServer.remoteAddressMap.remove(remoteAddress);super.channelInactive(ctx);}
}

main方法初始化netty

@SpringBootApplication
@MapperScan(basePackages = "com.kc.monitor.mapper")
public class MonitorApplication {public static void main(String[] args) {SpringApplication.run(MonitorApplication.class, args);// 初始化Netty服务器NettyServer nettyServer = new NettyServer();nettyServer.initServer();}}

服务端端主动给客户端发送消息

发送前提是以有客户端连接了服务器端。

注意:修改address客户端地址,也可以直接从remoteAddressMap中读取客户端地址。

    /*** 两种发送模式:* 1.根据远程客户端ip端口发送消息* 2.根据用户id发送消息** 目前版本使用方式1比较完善,已经实现客户端断开连接从map中删除该连接,第2种方式还没实现断开连接删除;按照需求可以两种方式结合一下。*/@GetMapping("/test")public void add(String msg){System.out.println(NettyServer.remoteAddressMap.size());System.out.println(NettyServer.userIdMap.size());// 1.根据客户端ip地址发送,发送消息到“/192.168.52.1:59807”客户端String address = "/192.168.52.1:59807";if (NettyServer.remoteAddressMap.containsKey(address)){NettyServer.remoteAddressMap.get(address).writeAndFlush(msg);}// 2.给用户id为1的客户端发送消息String userId = "1";if (NettyServer.userIdMap.containsKey(userId)){NettyServer.userIdMap.get(userId).writeAndFlush(msg);}}

Nerry实现服务器端指定客户端发送消息。相关推荐

  1. Socket服务端向指定客户端发送消息

    Socket服务端向指定客户端发送消息 解决思想 1.项目背景 2.如何上传与下发指令 3.解决方法 4.流程 解决思想 I.指定客户端远程地址是存起来的. II.服务端直接主动发信息给客户端,问题在 ...

  2. 服务器怎么向指定客户端发送信息,WebSocket 如何实现服务端向客户端发送消息?...

    我们都知道, Websocket 是一个双向的通讯方式,一般情况下,我们都是根据 Client 的情况返回信息,但是在一个更加健壮的系统,我们可能需要主动的向客户端发送消息.我试图在中文网络去搜索,查 ...

  3. ssm配置socket_ssm框架中集成websocket实现服务端主动向客户端发送消息

    找了很多配置文档及实例说明,也还是没能成功,最终在csdn博客中发现了基于stomp的消息推送的文章, 下面整理自csdn博客,https://blog.csdn.net/u013627689/art ...

  4. 【源码篇】Kafka客户端发送消息

    在上一篇文章中,已经介绍了初始化 KafkaProducer 基本流程.当客户端对 KafkaProducer 完成完成后,可以调用 send() 方法将数据发送至kafka broker集群. 图中 ...

  5. python企业微信回调_python 微信企业号-回调模式接收微信端客户端发送消息并被动返回消息...

    说明:此代码用于接收手机微信端发送的消息 #-*- coding:utf-8 -*- from flask import Flask,request from WXBizMsgCrypt import ...

  6. 云服务器怎么给客户端发送消息,服务器怎样向客户端发送消息

    服务器怎样向客户端发送消息 内容精选 换一换 使用SSH方式登录CentOS 6.5操作系统的弹性云服务器时,过一段时间就会自动断开连接.本节操作介绍如何保持SSH会话持续连接不断开该文档适用于Cen ...

  7. 【.net】通过企业微信web api给指定用户发送消息

    前言 在很多业务场景中经常会遇到与微博微信进行通信的需求,今天就和大家一起研究一下如果通过企业微信web api给指定用户发送消息 一.创建应用 1.打开企业微信并登录 https://work.we ...

  8. python企业微信回调_Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例...

    本文实例讲述了Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息.分享给大家供大家参考,具体如下: 说明:此代码用于接收手机微信端发送的消息 #-*- coding:utf-8 ...

  9. Qt Remote Object(QtRO)给指定的客户端发送消息

    概述 前面写了两篇文章介绍QtRO的使用方法,在这里: Qt Remote Object(QtRO)实现进程间通信 Qt Remote Object(QtRO)动态Replica实现进程间通信 然后会 ...

最新文章

  1. 修图动口不动手,有人把StyleGAN和CLIP组了个CP,能听懂修图指令那种
  2. 使用VS2008开发及部署Excel AddIn 心得
  3. 反积分饱和 程序_非常通俗易懂的PID控制(2)--积分饱和
  4. 用jQuery设置多个css样式
  5. 蓝宝石英语怎么读_黑金和蓝宝石
  6. cgblib 代理接口原理_Java开发者你还不知道?告诉你Dubbo 的底层原理,面试不再怕...
  7. 3gpp协议_春天工作室lt;3GPP规范翻译系列gt;1:TS37340协议翻译(导读)第一部分...
  8. 尴尬!三星Galaxy S10系列面部识别疑似翻车:连兄妹都分不清
  9. APT 分析报告:钓鱼邮件网址如何混淆 URL 逃避检测?
  10. 谈谈我在敏捷开发中遇到的那些坑
  11. MantisBT安装部署(XAMPP)邮件配置 中文配置
  12. 图像处理基础(二)_OpenCV命名规则
  13. linux复习题之阶段性考试题目
  14. Vins-fusion gps融合 KITTY数据集测试
  15. linux安装tftp服务器
  16. Ubuntu、Windows10 设置多个网卡连接网络的优先级(默认路由器设置)IPv4 + IPv6
  17. COS_头发渲染shader
  18. NET Reflector
  19. 中国行政区边界线下载(省,市,区县、乡镇边界线)
  20. Firefox火狐浏览器在http下允许通知

热门文章

  1. Shiro----散列算法(算法加密)
  2. 快手主页服务跳转微信技术教程
  3. 前端模块化详解(完整版)
  4. github怎么给别人看私密项目_关于Github的使用--创建私密仓库
  5. mysql数据库怎么比较时间_【数据库】mysql可以比较时间吗
  6. 70城最新房价数据出炉 楼市出现个“怪现象”
  7. HTML+CSS+JavaScript实现网络购物车
  8. python中x[:],x[:-1],x[:,]x[:,-1]等操作含义解析
  9. 启用Windows中的Telnet功能一起看DOS版星球大战
  10. 金蝶云星空对接打通四化智造MES(API)逐个单据查询接口与新增计量单位接口