图灵课堂netty 仿微信开发
通信的图文示例

以下是需要实现的前端界面,

准备工作:开始实现前需要技术关健字解释
第一步,这儿直接建一个maven 项目 就好,只要是可能用maven 管理包的环境就行,课程使用的版本是 java 17

新建工程包。

导入依赖包,。最新的netty
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.85.Final</version>
</dependency>
编后编写一个启动类,用于启动程序,在编写一个具体的业务,在启动类调用
编写启动类,取名:TuringMApplication 代码 如下
package turing.im;
public class TuringMApplication {
public static void main(String[] args) {
IMServer.start();
}
}
编写一个业务的类,在启动类调用 类名:IMServer
package turing.im;
public class IMServer {
public static void start() {
}
}
然后在IMServer 类中编写代码,保证代码运行起来。
package turing.im;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel; // 这里导入的是Netty的SocketChannel
import io.netty.channel.socket.nio.NioServerSocketChannel;
public class IMServer {
public static void start() {
EventLoopGroup bossGroup = new NioEventLoopGroup(1); // 通常bossGroup的数量设置为1
EventLoopGroup workerGroup = new NioEventLoopGroup(); // workerGroup可以根据需要设置为多线程
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
}
});
}
}
启动成功后可以输入 netstat -ano | findstr '8080' 查看也启动端口
接下来我们添加几个处理器,这些处我会红色标一下,需要说明的是这些处理器系统要用的,比如大文件,文件编吗之类,我们自己
的业务需要自己定义
package turing.im;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel; // 这里导入的是Netty的SocketChannel
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;
public class IMServer {
public static void start() throws InterruptedException {
EventLoopGroup bossGroup = new NioEventLoopGroup(1); // 通常bossGroup的数量设置为1
EventLoopGroup workerGroup = new NioEventLoopGroup(); // workerGroup可以根据需要设置为多线程
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() { // 这里的SocketChannel应该是Netty的SocketChannel
@Override
protected void initChannel(SocketChannel ch) throws Exception {
// 在这里添加初始化Channel的逻辑
ChannelPipeline pipeline = ch.pipeline();
// 添加Http编解码器,还有有些是其它自带还需要的处理管道
pipeline.addLast(new HttpServerCodec())
.addLast(new ChunkedWriteHandler())
.addLast(new HttpObjectAggregator(2024*64))
.addLast(new WebSocketServerProtocolHandler("/"))
// 以下是我们的自己的业务
.addLast(new WebSockeHandler());
}
});
bootstrap.bind(8080).sync();
}
}
然后在我们自己的类测试一下能不能输出文本,请注意参数部份。
package turing.im;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
public class WebSockeHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame tFrame) throws Exception {
System.out.println(tFrame.text());
}
}
现在可以运行测试,在线测试代码的地址: http://websocket-test.com/

运行成功后,编辑器和websoket 发送工具都 有我们发送的数据,如下图


浙公网安备 33010602011771号