首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Netty发送http响应

使用Netty发送http响应
EN

Stack Overflow用户
提问于 2016-10-12 20:01:55
回答 2查看 2.1K关注 0票数 1

我正在尝试使用Netty编写RTSP服务器。

现在,客户端发送请求。

代码语言:javascript
复制
OPTIONS rtsp://localhost:8080 RTSP/1.0
CSeq: 2
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)

我想发回下面的回复

代码语言:javascript
复制
RTSP/1.0 200 OK
CSeq: 2
Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE

我应该使用什么来构造http响应。我应该使用HttpResponse还是只使用普通字节数组并将其转换为ByteBuf?

我使用的Netty版本是4.1.5

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-15 11:29:48

选项请求的RTSP响应只包含头。

然后您可以简单地创建回复并使用以下方法填充它:

代码语言:javascript
复制
FullHttpResponse response = new DefaultFullHttpResponse(RtspVersions.RTSP_1_0, RtspResponseStatuses.OK);
response.headers().add(RtspHeadersNames.PUBLIC, "DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE");
response.headers().add(RtspHeadersNames.CSEQ, cseq);

响应选项请求的RTSP服务器的简化实现可以是:

代码语言:javascript
复制
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.SocketChannel;    
import io.netty.handler.codec.http.*;
import io.netty.handler.codec.rtsp.*;

public class RtspServer {
    public static class RtspServerHandler extends ChannelInboundHandlerAdapter {
        @Override
        public void channelReadComplete(ChannelHandlerContext ctx) {
            ctx.flush();
        }

        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) {                    
            if (msg instanceof DefaultHttpRequest) {                
                DefaultHttpRequest req = (DefaultHttpRequest) msg;
                FullHttpResponse response = new DefaultFullHttpResponse(RtspVersions.RTSP_1_0, RtspResponseStatuses.OK);
                response.headers().add(RtspHeadersNames.PUBLIC, "DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE");
                response.headers().add(RtspHeadersNames.CSEQ, req.headers().get("CSEQ"));
                response.headers().set(RtspHeadersNames.CONNECTION, RtspHeadersValues.KEEP_ALIVE);
                ctx.write(response);
            }
        }
    }

    public static void main(String[] args) throws Exception {    
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup);
            b.channel(NioServerSocketChannel.class);            
            b.childHandler(new ChannelInitializer<SocketChannel>() {
                @Override
                public void initChannel(SocketChannel ch) {
                    ChannelPipeline p = ch.pipeline();
                    p.addLast(new RtspDecoder(), new RtspEncoder());
                    p.addLast(new RtspServerHandler());
                }
            });

            Channel ch = b.bind(8554).sync().channel();
            System.err.println("Connect to rtsp://127.0.0.1:8554");
            ch.closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }       
    }
}
票数 3
EN

Stack Overflow用户

发布于 2016-10-13 19:03:43

您希望将FullHttpResponse与管道中的Rtsp处理程序一起使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40007349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档