手动实现一个Nginx加聊天室的案例
闲来无事?快来拿个小案例练手
简单易懂快速上手
案例不长快快 上车!
上车 GO! GO! GO!
相信通过这个案例能让你学到更多东西
关注收藏是我最大动力
文章目录- 服务器开发
- 环境准备
- 代码编写
- 服务器后端代码
- 聊天室前端代码
- 聊天室后端代码
- 效果测试
代码全部粘贴下面了,如果想要一个完整的包可以私信我,我也会把打包的链接留在后面
来介绍一下这个小案例:
1.服务器
- 实现一个资源通过http映射类似Nginx
我们的案例都在我们自己实现的服务器上面运行,没有使用Tomcat Nginx Spring等第三方
2.聊天业务
- 实现单聊
- 实现群聊
- 房间人数实时检查
- 实现离线消息
- 实现账号冲突强制下线
- 实现心跳在线检测
案例简介
Netty是Java的一个通信框架,是基于NIO来实现的,有许多的java中间件都是Netty来开发的,Netty的高性能是大家有目共睹,大家都认可的
本案例都是通过Netty来编写的,如果有netty基础可能更好理解一些,如果没有不要慌,如有需要私信我,马上更新Netty基础
这个案例分为两个阶段:
- 服务器开发
- 聊天室开发
话不多说开始编写代码
服务器开发 环境准备
先导入pom的配置
Netty的包,复制下来放到pom文件里就行了
io.netty netty-all 4.1.75.Final
环境准备就这么多,没错就这么多!都手写的还要这么多框架干嘛
代码编写 服务器后端代码
给大家简单介绍一下原理,非常简单
是通过Netty实现Http协议,然后根据浏览器发来需要的文件地址,我们通过IO流把文件字节码读取出来,然后再通过Http协议发送到浏览器
下面是详细介绍,最后有完整代码
先写一个想要映射的文件夹的路径
我想要映射这个文件夹
创建Netty的启动类,并绑定端口
handler处理器操作http并进行io操作把数据返回给浏览器
这样我们的服务器后端代码就结束了
来测试
在浏览器里输入我们的地址 localhost:8081
回车
OHHHHHHHHHHHHHHHHHH!
OHHHHHHHHHHHHHHHHHH!
我们的页面加载出来了,我写的路径为 / 默认加载index.html
服务器后端的全部代码,简短精悍
public static void main(String[] args) {
String baseUrl="C:\Users\Alie\Desktop\demo";
//初始化Netty
new ServerBootstrap()
.group(new NioEventLoopGroup())
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer() {
@Override
protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
//对http进行解码操作
nioSocketChannel.pipeline().addLast(new HttpServerCodec());
//对管道添加处理器指定类型为http
nioSocketChannel.pipeline().addLast(new SimpleChannelInboundHandler() {
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, HttpRequest httpRequest) throws Exception {
System.out.println(httpRequest.uri());
//获取请求的url
String url=httpRequest.uri();
//如果url为/则自动映射index.html文件
url=url.equals("/")?"/index.html":url;
//添加响应状态码200
DefaultFullHttpResponse defaultHttpResponse=new DefaultFullHttpResponse(httpRequest.protocolVersion(), HttpResponseStatus.OK);
//创建输入流从文件夹里去读取文件
FileInputStream fileInputStream=new FileInputStream(new File(baseUrl+url));
//字节数组暂存文件
byte[] bytes=new byte[1024];
int len=0;
//io操作将数据写回浏览器
while (-1!=(len=fileInputStream.read(bytes))) {
defaultHttpResponse.content().writeBytes(bytes,0,len);
}
//关闭资源
fileInputStream.close();
channelHandlerContext.writeAndFlush(defaultHttpResponse);
channelHandlerContext.close();
}
});
}
//绑定端口
}).bind(8081);
}
聊天室前端代码
由于前端代码比较简单就直接给大家,直接用就好了
图片提示


