Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
ZLMediaKit
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
张翔宇
ZLMediaKit
Commits
00e64ed2
Commit
00e64ed2
authored
Sep 16, 2019
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加注释完善代码
parent
78069ce0
显示空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
51 行增加
和
6 行删除
+51
-6
src/Http/WebSocketClient.h
+51
-6
没有找到文件。
src/Http/WebSocketClient.h
查看文件 @
00e64ed2
...
...
@@ -40,6 +40,11 @@ namespace mediakit{
template
<
typename
ClientType
,
WebSocketHeader
::
Type
DataType
>
class
HttpWsClient
;
/**
* 辅助类,用于拦截TcpClient数据发送前的拦截
* @tparam ClientType TcpClient派生类
* @tparam DataType 这里无用,为了声明友元用
*/
template
<
typename
ClientType
,
WebSocketHeader
::
Type
DataType
>
class
ClientTypeImp
:
public
ClientType
{
public
:
...
...
@@ -72,6 +77,11 @@ private:
onBeforeSendCB
_beforeSendCB
;
};
/**
* 此对象完成了weksocket 客户端握手协议,以及到TcpClient派生类事件的桥接
* @tparam ClientType TcpClient派生类
* @tparam DataType websocket负载类型,是TEXT还是BINARY类型
*/
template
<
typename
ClientType
,
WebSocketHeader
::
Type
DataType
=
WebSocketHeader
::
TEXT
>
class
HttpWsClient
:
public
HttpClientImp
,
public
WebSocketSplitter
{
public
:
...
...
@@ -82,6 +92,11 @@ public:
}
~
HttpWsClient
(){}
/**
* 发起ws握手
* @param ws_url ws连接url
* @param fTimeOutSec 超时时间
*/
void
startWsClient
(
const
string
&
ws_url
,
float
fTimeOutSec
){
string
http_url
=
ws_url
;
replace
(
http_url
,
"ws://"
,
"http://"
);
...
...
@@ -127,6 +142,9 @@ protected:
//TcpClient override
/**
* 定时触发
*/
void
onManager
()
override
{
if
(
_onRecv
){
//websocket连接成功了
...
...
@@ -136,7 +154,10 @@ protected:
HttpClientImp
::
onManager
();
}
}
//数据全部发送完毕后回调
/**
* 数据全部发送完毕后回调
*/
void
onFlush
()
override
{
if
(
_onRecv
){
//websocket连接成功了
...
...
@@ -167,7 +188,7 @@ protected:
*/
void
onRecv
(
const
Buffer
::
Ptr
&
pBuf
)
override
{
if
(
_onRecv
){
//完成websocket握手后,拦截websocket数据
//完成websocket握手后,拦截websocket数据
并解析
_onRecv
(
pBuf
);
}
else
{
//websocket握手数据
...
...
@@ -175,13 +196,17 @@ protected:
}
}
//tcp连接断开
/**
* tcp连接断开
* @param ex
*/
void
onErr
(
const
SockException
&
ex
)
override
{
//tcp断开或者shutdown导致的断开
onWebSocketException
(
ex
);
}
//WebSocketSplitter override
/**
* 收到一个webSocket数据包包头,后续将继续触发onWebSocketDecodePlayload回调
* @param header 数据包头
...
...
@@ -269,11 +294,14 @@ private:
}
return
buf
->
size
();
});
//设置sock,否则shutdown等接口都无效
_delegate
.
setSock
(
HttpClientImp
::
_sock
);
//触发连接成功事件
_delegate
.
_sock
=
HttpClientImp
::
_sock
;
_delegate
.
onConnect
(
ex
);
//拦截websocket数据接收
_onRecv
=
[
this
](
const
Buffer
::
Ptr
&
pBuf
){
//解析websocket数据包
WebSocketSplitter
::
decode
((
uint8_t
*
)
pBuf
->
data
(),
pBuf
->
size
());
};
return
;
...
...
@@ -298,7 +326,15 @@ private:
string
_payload
;
};
template
<
typename
ClientType
,
WebSocketHeader
::
Type
DataType
=
WebSocketHeader
::
TEXT
,
bool
userWSS
=
false
>
/**
* Tcp客户端转WebSocket客户端模板,
* 通过该模板,开发者再不修改TcpClient派生类任何代码的情况下快速实现WebSocket协议的包装
* @tparam ClientType TcpClient派生类
* @tparam DataType websocket负载类型,是TEXT还是BINARY类型
* @tparam useWSS 是否使用ws还是wss连接
*/
template
<
typename
ClientType
,
WebSocketHeader
::
Type
DataType
=
WebSocketHeader
::
TEXT
,
bool
useWSS
=
false
>
class
WebSocketClient
:
public
ClientTypeImp
<
ClientType
,
DataType
>
{
public
:
typedef
std
::
shared_ptr
<
WebSocketClient
>
Ptr
;
...
...
@@ -309,11 +345,20 @@ public:
}
~
WebSocketClient
()
override
{}
/**
* 重载startConnect方法,
* 目的是替换TcpClient的连接服务器行为,使之先完成WebSocket握手
* @param strUrl websocket服务器ip或域名
* @param iPort websocket服务器端口
* @param fTimeOutSec 超时时间
*/
void
startConnect
(
const
string
&
strUrl
,
uint16_t
iPort
,
float
fTimeOutSec
=
3
)
override
{
string
ws_url
;
if
(
userWSS
){
if
(
useWSS
){
//加密的ws
ws_url
=
StrPrinter
<<
"wss://"
+
strUrl
<<
":"
<<
iPort
<<
"/"
;
}
else
{
//明文ws
ws_url
=
StrPrinter
<<
"ws://"
+
strUrl
<<
":"
<<
iPort
<<
"/"
;
}
_wsClient
->
startWsClient
(
ws_url
,
fTimeOutSec
);
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论