一、该问题的重现步骤是什么?
1. 问题来源
2. 根据链接https://juejin.cn/post/6844904029244538893中服务端的代码:
package com.ytao.websocket;
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.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.handler.stream.ChunkedWriteHandler;
/**
* Created by YANGTAO on 2019/11/17 0017.
*/
public class WebSocketServer {
public static String HOST = "127.0.0.1";
public static int PORT = 8806;
public static void startUp() throws Exception {
// 监听端口的线程组
EventLoopGroup bossGroup = new NioEventLoopGroup();
// 处理每一条连接的数据读写的线程组
EventLoopGroup workerGroup = new NioEventLoopGroup();
// 启动的引导类
ServerBootstrap serverBootstrap = new ServerBootstrap();
try {
serverBootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception{
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast("logger", new LoggingHandler(LogLevel.INFO));
// 将请求和返回消息编码或解码成http
pipeline.addLast("http-codec", new HttpServerCodec());
// 使http的多个部分组合成一条完整的http
pipeline.addLast("aggregator", new HttpObjectAggregator(65536));
// 向客户端发送h5文件,主要是来支持websocket通信
pipeline.addLast("http-chunked", new ChunkedWriteHandler());
// 服务端自定义处理器
pipeline.addLast("handler", new WebSocketServerHandler());
}
})
// 开启心跳机制
.childOption(ChannelOption.SO_KEEPALIVE, true)
.handler(new ChannelInitializer<NioServerSocketChannel>() {
protected void initChannel(NioServerSocketChannel ch) {
System.out.println("WebSocket服务端启动中...");
}
});
Channel ch = serverBootstrap.bind(HOST, PORT).sync().channel();
System.out.println("WebSocket host: "+ch.localAddress().toString().replace("/",""));
ch.closeFuture().sync();
}catch (Exception e){
e.printStackTrace();
}finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
public static void main(String[] args) throws Exception {
startUp();
}
}
作者:ytao
链接:https://juejin.cn/post/6844904029244538893
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
通过注释,这段服务端的代码也是将请求和返回消息编码或解码成http,那这是使用WebSocket通信还是http通信?
代码只是例子。如果将请求和返回消息编码或解码成HTTP,则这是使用HTTP通信,而不是WebSocket通信。WebSocket通信是一种全双工协议,它使用单个TCP连接进行通信,并且不需要在每个消息之间进行HTTP握手。与此不同,HTTP通信是一种半双工协议,每个请求都需要建立一个新的TCP连接,并且在每个请求和响应之间进行HTTP握手。因此,如果请求和响应消息采用HTTP编码,则使用的是HTTP通信。
WebSocket是一种基于TCP协议实现的全双工通信协议,它可以在浏览器和服务器之间建立一个持久的连接,实现实时的双向通信。与HTTP协议不同,WebSocket协议是一种真正的双向通信协议,可以在客户端和服务器之间实现实时的数据交换。
WebSocket通信的原理如下:
1. 客户端向服务器发起WebSocket连接请求,请求头包含Upgrade和Connection字段,指定使用WebSocket协议进行通信。
2. 服务器返回101状态码,表示同意建立WebSocket连接,并在响应头中包含Upgrade和Connection字段,指定使用WebSocket协议进行通信。
3. 建立WebSocket连接后,客户端和服务器可以通过send()方法和onmessage事件来发送和接收消息。
4. WebSocket连接可以保持长时间的活动状态,客户端和服务器可以随时发送消息,而不需要每次都建立新的连接。
5. WebSocket连接可以通过close()方法来关闭连接。
WebSocket通信的特点:
1. 支持实时双向通信,可以实现服务器向客户端推送数据。
2. 建立连接时需要进行握手,建立连接后可以保持长时间的活动状态。
3. 数据格式轻量,通信性能高效。
4. 支持跨域通信。
5. 支持自定义协议,可以根据具体需求进行扩展。
扫一扫访问 Blade技术社区 移动端