UDP协议转换TCP协议

UDP协议转换TCP协议

项目背景:项目类似中间件 作用是数据搬运 ,可以搬运文件 ,视频,音频 。从互联网把数据搬运到内网中。有的时候拉取视频流数据的时候 使用UDP拉取会存在丢包的情况 通过TCP拉拉取视频流数据 再通过UDP发送这样可以保证质量也能提高效率。

着重说明协议转换

UDP协议转换TCP协议_第1张图片

使用的技术

1.netty
2.scoket

过程描述

测试利用两个视频开源平台  LiveGBS  一个放在内网中充当视频播放设备 此处命名为SPA2  一个放在外网中充当视频源平台 此处命名为SPA1,在使用一个摄像头设备 海康或者宇视都可以,摄像头绑定到SPA1上。在SPA2平台点击播放视频 ,SPA1视频数据通过中间件搬运到SPA2播放出来。
  1. SPA2发起UDP协议播放视频请求
  2. A2端接收到UDP协议请求 通过netty发送到A1端
  3. A1端通过已有的监听,监听到过来的请求信息 解析请求数据
  4. 解析UDP协议 修改信令里面的标识 RTP/AVP -->TCP/RTP/AVP
  5. 修改以后的信令发送给视频源平台 建立连接
  6. 视频源平台 返回对应的视频源数据 TCP
  7. 接收到TCP类型视频源数据 转还为UDP协议 数据方法方法 因为此时A2那边还是UDP监听 以下是主要 TCP协议转换UDP协议方法 代码

                    data = headerBuffer.array();//每段报文最前面的两位 [5,-124]
                    int len = Util.getLen(data,0); //数组包长度 1412
                    headerBuffer.clear();
                    byte[] contentData = new byte[len];// 每段数据包字节数组长度
                    int realLen =  in.read(contentData);//每段数据包真正的字节数组
                    ByteBuffer bb = ByteBuffer.allocate(len);//分配缓冲区
                    bb.put(contentData,0,realLen);//添加后面的数据包
                    while(realLen != len) {
                        byte[] tempArr = new byte[len-realLen];
                        int tempLen = in.read(tempArr);
                        bb.put(tempArr,0,tempLen);
                        realLen = tempLen + realLen;
                    }
                    byte[] result = bb.array();
                    RtpRtcpGapMsg rtpRtcpGapMsg = new RtpRtcpGapMsg(callId,oldIp,oldPort,protocol,isRtcp,result,packageIndex.getAndIncrement());
                    rtpRtcpGapMsg.setLastPackage(false);
                    msgTransfer(rtpRtcpGapMsg);
                }
            }
主要就是把每次发送的数据包 长度修改成符合UDP协议发送的长度 再把每次发送之前数据包的最前面标识位去掉 因为UDP协议是不需要的。

以上是简单的介绍,如有问题请私聊我,大家一起交流。

你可能感兴趣的:(网络通信)