Netty-使用netty实现群聊-代码实现

使用itchat模块控制微信发消息  概述    itchat是一个通过基于python3,封装了登录网页版微信并收发消息相关的接口。自己想要实现一个简单的微信机器人,并且以后可以通过该模块来控制树莓派,所以最近通过教程简单的实现了通过接受指定好友的消息并转发到对应群的功能。实现比较简单,实际上也就是参考http://itchat.readthedocs.io/zh/latest/ 上的教程编写的代码。模块安装    我是在树莓派上... 阅读详情

1、功能介绍

和之前的NIO实现群聊机制一样,这里使用Netty实现:

  • 1、当有新用户上线时,通知其他用户上线,下线同理
  • 2、用户x发送一条消息,服务器端转发给其他所有在线服务器

2、代码结构

在这里插入图片描述

3、GroupChatServer

package groupchat;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
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 java.beans.Encoder;

public class GroupChatServer {
    //监听端口
    private int port;

    public GroupChatServer(int port){
        this.port = port;
    }

    //编写run方法,处理客户端的请求
    public void run() throws Exception{
        //创建两个线程组
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        //其中NioEventLoppGroup默认八个线程
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            //创建ServerBootstrap,服务器启动引导类
            ServerBootstrap b = new ServerBootstrap();
            //设置ServerBootstrap相关参数
            b.group(bossGroup, workerGroup)//roup函数设置两个EventLoop
                    .channel(NioServerSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG, 128)
                    .childOption(ChannelOption.SO_KEEPALIVE, true)
                    .childHandler(new ChannelInitializer<SocketChannel>() {//指定相关handler
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            //获取pipeline
                            ChannelPipeline pipeline = ch.pipeline();
                            //向pipeline中加入解码器
                            pipeline.addLast("decoder", new StringDecoder());
                            //向pipeline中加入编码器
                            pipeline.addLast("encoder", new StringDecoder());
                            //加入自己的业务处理handler,需要自己写!关键部分
                            pipeline.addLast(new GroupChatServerHandler());
                        }
                    });
            System.out.println("Netty服务器已启动");
            ChannelFuture channelFuture = b.bind(port).sync();
            //监听关闭事件
            channelFuture.channel().closeFuture().sync();
        }finally {
            //关闭
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
    }

    }

    //主函数,也需要抛出异常
    public static void main(String[] args) throws Exception{
        //启动一个服务器
        new GroupChatServer(7000);
    }
}

4、GroupChatServerHandler

package groupchat;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;

import java.text.SimpleDateFormat;
import java.util.SimpleTimeZone;

public class GroupChatServerHandler extends SimpleChannelInboundHandler<String> {
    //定义一个channelle组,管理所有的channel
    //GlobalEventExecutor.INSTANCE是全局的时间执行器,是一个单例,帮助执行channelGroup
    private static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
    //输出接收到消息的时间用
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    //当连接建立之后,第一个被执行,将当前的channel加入到channelGroup
    @Override
    public  void handlerAdded(ChannelHandlerContext ctx) throws Exception{
        Channel channel = ctx.channel();
        //将该客户端加入聊天的消息  发送给其他的在线客户端
        //writeAndFlush方法会自动遍历所有的channel,并发送括号内消息
        //最后加入当前消息发送的时间
        channelGroup.writeAndFlush("客户端" + channel.remoteAddress() + "加入聊天\n"
                + sdf.format(new java.util.Date()) + "\n");
        //channelGroup中加入该channel
        channelGroup.add(channel);
    }

    //断开连接,触发该通知给当前在线的客户
    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
        Channel channel = ctx.channel();
        channelGroup.writeAndFlush("客户端" + channel.remoteAddress() + "离开聊天了\n");
        System.out.println("测试用:"+"channelGroup_size=" + channelGroup.size() );
    }

    //channel出于活动状态,提示xxx已上线
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception{
        System.out.println(ctx.channel().remoteAddress() + "上线");
    }

    //提示xxx离线
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception{
        System.out.println(ctx.channel().remoteAddress() + "离线了");
    }

    //读取数据并转发数据给当前在线的其他客户端
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
        //获取当前channel
        //给自己发送的消息是不一样的
        final Channel channel = channelHandlerContext.channel();
        //根据不同的情况,需要会送不同的消息
        channelGroup.forEach(ch -> {
            if(channel != ch)
                ch.writeAndFlush("[客户]" + channel.remoteAddress() + "发送了消息:" + s + "\n");
            else
                ch.writeAndFlush("[自己]" + "发送了消息:" + s + "\n");
        });
    }

    //发生异常时
    @Override
    public void exceptionCaught(ChannelHandlerContext var1, Throwable var2) throws Exception{
        //关闭通道
        var1.close();
    }

}

5、GroupChatClient

package groupchat;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.pool.ChannelPool;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

import javax.naming.event.EventContext;
import java.awt.*;
import java.util.Scanner;

public class GroupChatClient {
    //主机地址
    private final String host;
    //端口
    private final int port;

    public GroupChatClient(String host, int port) {
        this.host = host;
        this.port = port;
    }

    public void run() throws Exception{
        EventLoopGroup eventExecutors = new NioEventLoopGroup();
        try {
            Bootstrap bootstrap = new Bootstrap()
                    .group(eventExecutors)
                    .channel(NioSocketChannel.class)
                    .handler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected  void initChannel(SocketChannel ch) throws Exception{
                            //得到pipeline
                            ChannelPipeline pipeline = ch.pipeline();
                            //加入相关handler
                            pipeline.addLast("decoder",new StringDecoder());
                            pipeline.addLast("encoder",new StringEncoder());
                            //加入自定义handler
                            pipeline.addLast(new GroupChatServerHandler());
                        }
                    });
            ChannelFuture channelFuture = bootstrap.connect(host,port).sync();
            //得到当前channel
            Channel channel = channelFuture.channel();
            System.out.println("......" + channel.localAddress() + "......");

            //客户端需要输入信息,使用Scanner扫描器
            Scanner scanner = new Scanner(System.in);
            while(scanner.hasNextLine()){
                String msg = scanner.nextLine();
                //将消息通过channel发送给服务器端
                channel.writeAndFlush(msg + "\r\n");
            }
        }finally {
            eventExecutors.shutdownGracefully();
        }
    }

    //客户端主函数
    public static void main(String[] args) throws Exception {
        new GroupChatClient("127.0.0.1",7000).run();
    }
}

6、GroupChatClientHandler

package groupchat;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

public class GroupChatClientHandler extends SimpleChannelInboundHandler<String> {

    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, String msg) throws Exception {
        System.out.println(msg.trim());
    }
}

7、测试方法

  • 1)新建一个Maven工程,导入netty依赖
  • 2)按照2结构搭建代码
  • 3)运行服务器端GroupChatServer
  • 4)运行一个客户端GroupChatClient,再切换端口运行新的客户端,进行测试,收发消息/通知与否

8、遇到的问题

遇到Exception异常Exception in thread "main" io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: /127.0.0.1:53853
应该是IP或者端口设置错了,尝试设置一下本地计算机

基于netty去实现websocket 单聊+群聊 前端使用layui模板引擎 本项目开发周期比较短 大部分都是围绕业务来去实现 很多需要完善地方这里只是出了一个简短的例子 ps:在此之前没有搞过即时通讯,这个项目也算是入门大佬勿喷 所使用的技术: netty,rabbitMQ,redis,mongoDB,mysql 先上java依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- 阅读详情

相关推荐

Jetson nano/nx使用麒麟arm版向日葵实现远程控制

Jetson nano/nx使用麒麟arm版向日葵实现远程控制1、安装向日葵软件2、运行Sunlogin Client3、向日葵闪退问题4、重启系统5、重启后黑屏问题 特别提醒: 本博客的第3步切换桌面管理环境到lightdm,存在重启后开机黑屏的风险,我在自己的nano/nx上都没有问题,但帮一个同学的nx配置时,切换到lightdm,重启开机却出现了黑屏,所以执行第3步的话要有心理准备,黑屏解决方法见第5步,特此提醒。

胡乱学点东西 2万+

尚硅谷-netty笔记

1:简介 Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github上的独立项目。 Netty 是一个异步的、基于事件驱动(客户端的行为、读写事件)的网络应用框架,用以快速开发高性能、高可靠性的网络 IO 程序。 Netty主要针对在TCP协议下,面向Clients端的高并发应用,或者Peer-to-Peer场景下的大量数据持续传输的应用。 Netty本质是一个NIO框架,适用于服务器通讯相关的多种应用场景 要透彻理解Netty , 需要先学习 NIO , 这样我们才能阅读 Netty

weixin_44801482的博客 2836

MIPI video mode 和 command mode 的区别

1、何为LCD RAM? LCD 是指字面意思是液晶显示屏(Liquid Crystal Display), 而RAM: 随机存取存储器(Random-Access Memory),两者完全是风马牛不相及的东西。 下图是一个标准的LCD的爆炸图(不含TP),请注意图中红色mark的地方:控制IC-- LCD的大脑。所谓的LCD RAM自然是指此大脑是否包含RAM. 题外话<不感兴趣的...

精诚所至 4689

Android聊天室(客户端)

Android聊天室(客户端) 作者:黑衣侠客 一.前言: 这是我目前写的第二个Android App,但是目前因为知识有限,所以对一些代码不能解释到位,其中有些代码形式参考了网上的一些部分,后期慢慢我会将本篇博客进行修改和完善,此次Android网络聊天室会分成3篇博客进行讲解《Android聊天室(客户端)》,《Android聊天室(服务器)》,《Android聊天室(源码)》。由于目前gi...

weixin_44900700的博客 9818

避坑指南:Qt无边框窗口拖动+阴影效果这些细节要注意

本文深入探讨了Qt无边框窗口开发中实现流畅拖动与阴影效果的关键细节与常见陷阱。针对高DPI屏幕适配、阴影闪烁、拖动卡顿及多显示器兼容性等核心难题,提供了从QGraphicsDropShadowEffect原理剖析到手动绘制优化、坐标系统精准处理及平台原生事件拦截的实战解决方案,帮助开发者构建稳定、美观的商业级应用界面。

weixin_27943395的博客 478

浅谈Android MVI架构---大自然的搬运工~~~

浅谈 Android MVI架构

hong_world的博客 2152

vue.js仿微信聊天窗口展示组件

原链接:https://www.jianshu.com/p/0faf8e78d0a5 源码:https://github.com/doterlin/vue-wxChat 演示地址:https://doterlin.github.io/vue-wxChat/ 运行 # install dependencies npm install # serve with hot reload at lo...

weixin_44311540的博客 9412

单细胞分析避坑指南:SCTransform和Harmony参数设置详解

本文深入解析了单细胞分析中SCTransform标准化与Harmony批次校正的关键参数设置。针对10x Genomics等数据,详细探讨了如何通过调整`vars.to.regress`、`theta`等核心参数,在有效去除技术噪音的同时,避免过度校正以保留关键的生物学差异,从而提升分析结果的可靠性与可解释性。

weixin_29053073的博客 608

chat(8)程序 man手册

chat程序定义了计算机和调制解调器之间的对话交换。它的主要目的是在点对点协议守护进程(pppd)和远程的pppd进程之间建立连接。

ZHENYU的博客 5706

Cadence virtuos安装教程

本文详细介绍了在Ubuntu 18.04系统上安装Cadence Virtuoso IC617及MMSIM的完整流程。主要内容包括:1)系统环境准备(安装JDK及相关依赖包);2)通过创建软链接和修改系统文件实现RedHat环境兼容;3)共享目录文件操作与分卷压缩包合并解压技巧;4)使用InstallScape工具的安装步骤详解,包括权限处理和配置选项。特别提醒需注意系统兼容性处理(如创建redhat-release文件)和分卷压缩包的特殊解压方法(cat合并)。整个安装过程涉及大量Linux命令操作,需特

wangjie36的博客 298

RGB渐变颜色转换公式及例程

设Step=51,将RGB(255,0,0)颜色渐变为RGB(0,255,0),即RGB(255,0,0)经过51次颜色渐变转为RGB(0,255,0);设Step=51,将RGB(0,255,0)颜色渐变为RGB(0,0,255),即RGB(0,255,0)经过51次颜色渐变转为RGB(0,0,255);设Step=51,将RGB(0,0,255)颜色渐变为RGB(255,0,0),即RGB(0,0,255)经过51次颜色渐变转为RGB(255,0,0);分步骤的方式,使其渐变色循环整个颜色值;

1万+

Netty案例介绍-群聊案例实现

import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.stri

m0_67613962的博客 393

微信8.0所有URL Scheme大全:隐藏入口与使用场景详解 内附195条微信URL Scheme

URL Scheme 类似于一个协议地址,它的作用和网页的https://差不多,只不过它不是打开网页,而是直接跳转到微信App内部的功能页面。→ 打开微信扫一扫→ 打开零钱通详情→ 打开微信面对面支付微信功能的“快捷指令”。整理下来,微信的 URL Scheme 基本覆盖了支付、联系人、扫一扫、小程序、运动设备等多个入口。对开发者来说,这些 Scheme 就像是隐藏的快捷通道,在某些场景(比如支付唤起、活动红包、客服入口)能大大简化流程。微信对外部调用限制非常严格。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2169

Netty剖析之Netty群聊系统

前言 在前面我们讲解了Netty的基本使用,本次我们将使用Netty来完成一个群聊系统,实现服务器端和客户端之间的数据简单通讯; 群聊系统基本要求: 服务器端可监测客户端上线、离线、并转发客户端消息; 客户端可群发消息给其它用户,也可接收其它客户发送的消息; 代码示例 服务端: public class GroupChatServer { private String host; ...

皓晨的架构笔记 609

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Netty:实现群聊系统+自定义名称+空闲检测+Protobuf

作为一个Java小白,持续学习是不可避免的,近期学习了Netty的相关知识,使用Netty实现了一个简单的群聊系统,使用Protobuf进行传输,支持空闲心跳检测,并且可以自定义群聊名称,所以写了此篇文章,做个知识记录。 代码结构 代码 代码中我添加了详细的注释,所以接下来我就不进行解释了,直接贴代码: 1:客户端 /** * @Author: wlc * @Date: 2020/7/19 17:51 * @Description: Netty 群聊客户端 **/ public c.

Java小白的博客 554

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

基于netty的在线聊天室,支持群聊和私聊——【一】基本功能介绍和nginx配置

netty虽然可以实现聊天室的功能。但完整的坐下来,还是要自己去封装很多东西,尤其是数据交互的协议,消息的分发等。这一点就比spring 的websocket over stomp差远了 具体效果 支持1v1聊天和多人聊天,自己创建群聊,具体演示地址点我 登陆界面: 密码不用输入 然后是主面板: ...

siwash的博客 1878

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Netty进阶 -- 非阻塞网络编程 实现群聊+私聊+心跳检测系统

通俗易懂带入Netty,Netty非阻塞网络编程 实现群聊+私聊+心跳系统

wanghuichen的博客 4174

网络:Java用Netty实现一个群聊服务器与群聊客户端

记录一下实现代码,写得很粗糙,先启动1个服务端,然后起1到多个客户端,每个客户端先控制台输入聊天昵称,然后可以在聊天室发送消息。退出时输入特定字符 “bye” 即可退出群聊。服务器会显示所有聊天过程(包括系统信息)。客户端在线时也能收到所有聊天信息(包括系统信息)。大概如下: 下面是代码: 1、Maven依赖 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all&lt

weixin_39448458的博客 643

基于Netty做一个简单的群聊服务端

学习目标: 加粗样式 提示:这里可以添加学习目标 例如:一周掌握 Java 入门知识 学习内容: 提示:这里可以添加要学的内容 例如: 1、 搭建 Java 开发环境 2、 掌握 Java 基本语法 3、 掌握条件语句 4、 掌握循环语句 学习时间: 提示:这里可以添加计划学习的时间 例如: 1、 周一至周五晚上 7 点—晚上9点 2、 周六上午 9 点-上午 11 点 3、 周日下午 3 点-下午 6 点 学习产出: 提示:这里统计学习计划的总量 例如: 1、 技术笔记 2 遍 2、优快云 技术博

liuqi199707的博客 419

基于netty的简单群聊代码

服务器: package GroupChat; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io....

weixin_43490369的博客 341

8.基于netty实现群聊,心跳检测

1.本文总结自B站《netty-尚硅谷》,很不错;2.本文示例代码包括。

PacosonSWJTU的博客 1005

netty简单入门案例

Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。我们在网络编程的时候一般都会使用该框架作为基础框架,下面使用netty来实现简单的群聊系统来认识netty的基本使用方法。 服务端: public class GroupChatServer { private int port;//定义端口信息 private GroupChatServer(int port){ this.port = port;

煜城的博客 372

Netty群聊系统(Netty十一)

服务器端: public class GroupChatServer { private int port; public GroupChatServer(int port) { this.port = port; } public void run() throws Exception { //创建两个线程组 NioEventLoopGroup bossGroup = new NioEventLoopGroup(1)

qq_36594703的博客 365

使用Netty实现最简单的聊天

Netty是对NIO的封装。虽然其使用比Java BIO(也就是传统的基于流或字符阻塞型的数据读写)也要复杂。不过效率高。没有那么多废话。本片的目标是使用Netty实现一个聊天功能。功能的完善、需要大家在亲自操刀。 服务器端 Netty服务器端的一般写法。 package com.example.gch; import io.netty.bootstrap.ServerBootstrap; im...

guchuanhang的专栏 1054

基于Netty的群聊系统

目录 需求功能 实现思路 服务端实现 服务器实现类 业务处理器: 客户端实现 客户端启动类: 客户端业务处理器: 需求功能 实现思路 服务端实现 服务器实现类 public class NettyGroupChatServer { private int port; public NettyGroupChatServer(int por...

isaiah的专栏 326

【学习笔记】netty

netty学习笔记

weixin_47585404的博客 811
上一篇: Netty-Unpooled类-细节使用
下一篇: Java错误解决-incompatible types: cannot infer type arguments for PriorityQueue<>
酱油瓶啤酒杯
博客等级 码龄8年 35粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值