websocket中,可以支持双向的数据通信。其中所有的数据格式,都是以帧的形式来传递。

initializer

 import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
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 WebSocketChannelinitializer extends ChannelInitializer<SocketChannel> { @Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new HttpServerCodec());
pipeline.addLast(new ChunkedWriteHandler());//分块的方式
pipeline.addLast(new HttpObjectAggregator(8192));//http聚合 将块聚合成完整的
pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));//专门的websocket处理器, ws是指访问的路径 pipeline.addLast(new TextWebSocketFrameHandler()); } }

handler

 import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; import java.time.LocalDateTime; /**
* @ClassName: TextWebSocketFrameHandler websocket 都是以帧的形式来传递的,这里用的是文本
* @Description: 描述
* @Author:
* @CreateDate: 2019/9/1 17:08
* @Version: 1.0
*/
public class TextWebSocketFrameHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> { @Override
protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
System.out.println("收到消息: " + msg.text());
Channel channel = ctx.channel();
channel.writeAndFlush(new TextWebSocketFrame("服务器时间: " + LocalDateTime.now()));
} @Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
System.out.println("handlerAdded: " + ctx.channel().id().asLongText());//每个channel都有全局的id 分为长和短的 长的,保证唯一 短的不一定唯一
} @Override
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
System.out.println("handlerRemoved: " + ctx.channel().id().asLongText());
} @Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
System.out.println("异常发生");
ctx.close();
}
}

页面例子:

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebSocket客户端</title>
</head>
<body>
<!--第五个例子用到-->
<form onsubmit="return false;">
<textarea name="message" style="width: 400px;height: 200px">
</textarea> <input type="button" value="发送短信" onclick="send(this.form.message.value)"> <h3>服务器端输出:</h3> <textarea id="responseText" style="width: 400px; height: 300px"> </textarea> <input type="button" onclick="javascript: document.getElementById('responseText').value = ''" value="清空内容">
</form> <script type="application/javascript">
var socket;
if(window.WebSocket) {
socket = new WebSocket("ws://localhost:8899/ws"); socket.onmessage = function (ev) {
//客户端获取到服务器端的消息
var ta = document.getElementById("responseText");
ta.value = ta.value + "\n" + ev.data;
} socket.onopen = function (ev) {
var ta = document.getElementById("responseText");
ta.value = "连接开启";
}
socket.onclose = function (ev) {
var ta = document.getElementById("responseText");
ta.value = ta.value + "\n" + "连接关闭";
} } else {
alert("浏览器不支持WebSocket");
} function send(message) {
if(!window.WebSocket) {
return;
} if(socket.readyState == WebSocket.OPEN) {
socket.send(message);
} else {
alert("连接未开启");
}
}
</script> </body>
</html>

最新文章

  1. 机器指令翻译成 JavaScript —— No.5 指令变化
  2. jQuery 2.0.3 源码分析Sizzle引擎 - 解析原理
  3. SharePoint 2013 工作流平台的选项不可用
  4. 修改httpd默认端口号
  5. Java框架--jQueryEasyUI
  6. 【转】KVM/Installation
  7. iOS探究UITableView的内部代码,仿UITableView自定义
  8. linux下创建且挂载光盘镜像
  9. [20190402]关于semtimedop函数调用2.txt
  10. ROS笔记1 安装及创建一个ROS Package
  11. C++入门程序作业2
  12. PAT A1010.Radix 二分法
  13. Java容器解析系列(5) AbstractSequentialList LinkedList 详解
  14. asp.net mvc Htmlhelper简单扩展
  15. centos7系统下安装php-fpm并配置nginx支持并开启网站gzip压缩
  16. 05_ssm基础(六)之SpringMVC
  17. .net使用NPOI的XSSFWorkbook进行web开发中导出Excel
  18. 提升HTML5的性能体验系列之五 webview启动速度优化及事件顺序解析
  19. Replication--对发布修改的一些小总结
  20. 使用jQuery和CSS3制作数字时钟(jQuery篇) 附源码下载

热门文章

  1. 华为OSPF与ACL综合应用
  2. vue脚手架安装,新建项目,打包
  3. NSDateFormatter格式详细列表一览
  4. ES6——async函数
  5. [TimLinux] MySQL InnoDB的外键约束不支持set default引用选项
  6. Selenium之下拉框操作
  7. KEIL MDK 算式优先级 备忘
  8. Python发送邮件以及对其封装
  9. 【CSS】357- 坚定地使用 CSS Custom Properties
  10. 大数据学习笔记——Hbase高可用+完全分布式完整部署教程