JAVA使用netty建立websocket连接
依赖
- <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>2.4</version>
- </dependency>
也用了
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <version>1.18.20</version>
- </dependency>
WebsocketNettyServerBootstrap.java
- 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.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 WebsocketNettyServerBootstrap {
- public static void main(String[] args) {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
- EventLoopGroup workerGroup = new NioEventLoopGroup();
- try {
- //创建服务器端的启动对象,配置参数
- ServerBootstrap bootstrap = new ServerBootstrap();
- //设置两个线程组
- bootstrap.group(bossGroup, workerGroup)
- //使用NioServerSocketChannel 作为服务器的通道实现
- .channel(NioServerSocketChannel.class)
- //设置线程队列得到连接个数
- .option(ChannelOption.SO_BACKLOG, 128)
- //设置保持活动连接状态
- .childOption(ChannelOption.SO_KEEPALIVE, true)
- //给workerGroup 的 EventLoop 对应的管道设置处理器
- .childHandler(new ChannelInitializer<SocketChannel>() {
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- ChannelPipeline pipeline = ch.pipeline();
- /**
- * 因为基于http协议,使用http的编解码器
- */
- pipeline.addLast(new HttpServerCodec());
- /**
- * 是以块方式写,添加 ChunkedWriteHandler 处理器
- */
- pipeline.addLast(new ChunkedWriteHandler());
- /**
- * http数据传输过程是分段的,HttpObjectAggregator,就是可以将多段聚合
- * 当浏览器发送大量数据时,就会发出多次http请求
- */
- pipeline.addLast(new HttpObjectAggregator(8192));
- /**
- * 对于websocket数据是以 帧 形式传递
- * 浏览器请求时 ws://localhost:7000/hello 其中 hello会与下面的对应
- * WebSocketServerProtocolHandler 核心功能是将http协议升级为ws协议,保持长链接
- */
- pipeline.addLast(new WebSocketServerProtocolHandler("/hello"));
- //自定义handler
- pipeline.addLast(new TextWebsocketFrameHandler());
- }
- });
- //启动服务器并绑定一个端口并且同步生成一个 ChannelFuture 对象
- ChannelFuture cf = bootstrap.bind(7000).sync();
- if (cf.isSuccess()) {
- System.out.println("websocket server start---------------");
- }
- //对关闭通道进行监听
- cf.channel().closeFuture().sync();
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- //发送异常关闭
- bossGroup.shutdownGracefully();
- workerGroup.shutdownGracefully();
- }
- }
- }
TextWebsocketFrameHandler.java
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.SimpleChannelInboundHandler;
- import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
- import lombok.extern.slf4j.Slf4j;
- /**
- * TextWebSocketFrame 表示一个文本帧
- */
- @Slf4j
- public class TextWebsocketFrameHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
- @Override
- protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
- log.info(">>>>>>>>>>>服务端收到消息:{}", msg.text());
- /**
- * 回复消息
- */
- ctx.writeAndFlush(new TextWebSocketFrame("服务器收到了,并返回:"+msg.text()));
- }
- /**
- * 当web客户端连接后,触发方法
- * @param ctx
- * @throws Exception
- */
- @Override
- public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
- /**
- * 这个ID是唯一的
- */
- log.info(">>>>>>>>>>>> channelId:{} 连接",ctx.channel().id().asLongText());
- /**
- * 这个ID不是唯一的
- */
- log.info(">>>>>>>>>>>> channelId:{} 连接",ctx.channel().id().asShortText());
- }
- @Override
- public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
- log.info(">>>>>>>>>>>>> channelId:{} 关闭了",ctx.channel().id().asLongText());
- }
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
- log.error(">>>>>>>>发送异常:{}",cause.getMessage());
- ctx.close();
- }
- }
JAVA使用netty建立websocket连接的更多相关文章
- 结合实际需求,在webapi内利用WebSocket建立单向的消息推送平台,让A页面和服务端建立WebSocket连接,让其他页面可以及时给A页面推送消息
1.需求示意图 2.需求描述 原本是为了给做unity3d客户端开发的同事提供不定时的消息推送,比如商城购买道具后服务端将道具信息推送给客户端. 本篇文章简化理解,用“相关部门开展活动,向全市人民征集 ...
- 使用wireshark抓包分析浏览器无法建立WebSocket连接的问题(server为Alchemy WebSockets组件)
工作时使用了Websocket技术,在使用的过程中发现,浏览器(Chrome)升级后可能会导致Websocket不可用,更换浏览器后可以正常使用. 近日偶尔一次在本地调试,发现使用相同版本的Chrom ...
- HTML5 WebSocket与C# 建立Socket连接
一.WebSocket 概述 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务 ...
- 教你正确地利用Netty建立连接池
一.问题描述 Netty是最近非常流行的高性能异步通讯框架,相对于Java原生的NIO接口,Netty封装后的异步通讯机制要简单很多. 但是小K最近发现并不是所有开发人员在使用的过程中都了解其内部实现 ...
- Caused by: java.io.IOException: 您的主机中的软件中止了一个已建立的连接。
异常详情 2017-07-16 10:55:26,218 ERROR [500.jsp] - java.io.IOException: 你的主机中的软件中止了一个已建立的连接. org.apache. ...
- Caused by: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。
org.apache.catalina.connector.ClientAbortException: java.io.IOException: 你的主机中的软件中止了一个已建立的连接. at org ...
- org.apache.catalina.connector.ClientAbortException: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。
org.apache.catalina.connector.ClientAbortException: java.io.IOException: 你的主机中的软件中止了一个已建立的连接. at org ...
- java.io.IOException: 您的主机中的软件中止了一个已建立的连接解决办法
问题现象和http://hi.baidu.com/cara_cloud/item/193a3ee327546d395a2d64be描述的一样,就是在eclipse的console栏中一直显示java. ...
- java.io.IOException: 你的主机中的软件中止了一个已建立的连接。
1.异常表现:我在jsp文件中有一个<form>表单,里面有一个<button>保存事件按钮.<button onclick="addOrUPdate()&q ...
随机推荐
- 洛谷 P4663 - [BalticOI 2008]魔法石(dp)
题面传送门 A:我该是有多无聊来写这种题的题解啊 B:大概是因为这题题解区里没有题解所以我来写一篇了,说明我有高尚的济世情怀(大雾 跑题了跑题了 首先看到字典序第 \(i\) 小小可以自然地想到按位决 ...
- CF1437G Death DBMS
题面传送门. 题意简述:给出 \(n\) 个字符串 \(s_i\),每个 \(s_i\) 初始权值为 \(0\).\(q\) 次操作:修改 \(s_i\) 的权值:查询给出字符串 \(q\) 能匹配的 ...
- 记一次VS2010和VS2015自定义颜色的过程
首先,是遇到的问题: 一天,使用VS2010看新项目代码时候,发现选中某个变量后,其它位置高亮显示的变量颜色太淡,不利于阅读代码,如下图.所以想修改这个颜色. 后来网上找了一遍,可以这样设置:工具-- ...
- C++ and OO Num. Comp. Sci. Eng. - Part 2.
本文参考自<C++ and Object-Oriented Numeric Computing for Scientists and Engineers>. 1. Basic Types ...
- R包对植物进行GO,KEGG注释
1.安装,加载所用到到R包 用BiocManager安装,可同时加载依赖包 source("https://bioconductor.org/biocLite.R") BiocMa ...
- Django向数据库批量插入数据
# 如何向数据库一次性插入多条数据 # 方法一:效率极低,不推荐使用 for i in range(1000): models.Book.objects.create(title=f'第{i}本书') ...
- tcp可靠传输的机制有哪些(面试必看
一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节,大于MTU.这个时候发送方IP层 ...
- 详解getchar()函数与缓冲区
1.首先,我们看一下这段代码: 它的简单意思就是从键盘读入一个字符,然后输出到屏幕.理所当然,我们输入1,输出就是1,输入2,输出就是2. 那么我们如果输出的是12呢? 它的输出是1. 这里我们先简单 ...
- Vue相关,Vue JSX
JSX简介 JSX是一种Javascript的语法扩展,JSX = Javascript + XML,即在Javascript里面写XML,因为JSX的这个特性,所以他即具备了Javascript的灵 ...
- Linux学习 - 网络命令
一.write 1 功能 给指定在线用户发信息,以Ctrl + D保存结束 2 语法 write <用户名> [信息] 二.wall(write all) 1 功能 给所有在线用户发送 ...