Skip to content

Commit e5578b7

Browse files
committed
Merge branch 'dev_tcp_client_chengxin' into 'feature_tcp_client'
【ENH】长连接推送抽一层接口层,接口和实现分离 See merge request server/openapi/openapi-cpp-sdk!18
2 parents d0796ad + f80f2b4 commit e5578b7

File tree

6 files changed

+102
-68
lines changed

6 files changed

+102
-68
lines changed

demo/openapi_cpp_test/openapi_cpp_test.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -454,8 +454,8 @@ int main()
454454
config.socket_port = U("");
455455
#endif
456456

457-
auto push_client = PushClient::create_push_client(config);
458-
push_client->connect(config);
457+
auto push_client = IPushClient::create_push_client(config);
458+
push_client->connect();
459459
std::string input;
460460
while (true)
461461
{

include/tigerapi/push_client.h

Lines changed: 10 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,52 +2,28 @@
22
#define PUSH_CLIENT_H
33
#include <memory>
44
#include <functional>
5-
#include <thread>
6-
#include "boost/asio/io_service.hpp"
75
#include "tigerapi/win32.h"
8-
#include "openapi_pb/pb_source/Request.pb.h"
9-
#include "openapi_pb/pb_source/Response.pb.h"
106
#include "openapi_pb/pb_source/AssetData.pb.h"
117

128
namespace TIGER_API
139
{
14-
class PushSocket;
1510
class ClientConfig;
16-
17-
class OPENAPI_EXPORT PushClient : public std::enable_shared_from_this<PushClient>
11+
class OPENAPI_EXPORT IPushClient
1812
{
1913
public:
20-
static std::shared_ptr<PushClient> create_push_client(const TIGER_API::ClientConfig& client_config);
21-
~PushClient();
22-
PushClient(const PushClient&) = delete;
23-
PushClient& operator=(const PushClient&) = delete;
24-
private:
25-
PushClient();
26-
public:
27-
void connect(const TIGER_API::ClientConfig& client_config);
28-
void disconnect();
14+
static std::shared_ptr<IPushClient> create_push_client(const TIGER_API::ClientConfig& client_config);
15+
virtual void connect() = 0;
16+
virtual void disconnect() = 0;
2917

30-
void set_connected_callback(const std::function<void()>& cb);
31-
void set_disconnected_callback(const std::function<void()>& cb);
32-
void set_inner_error_callback(const std::function<void(std::string)>& cb);
18+
virtual void set_connected_callback(const std::function<void()>& cb) = 0;
19+
virtual void set_disconnected_callback(const std::function<void()>& cb) = 0;
20+
virtual void set_inner_error_callback(const std::function<void(std::string)>& cb) = 0;
3321

34-
void set_asset_changed_callback(const std::function<void(const tigeropen::push::pb::AssetData&)>& cb);
35-
bool subscribe_asset(const std::string& account);
36-
bool unsubscribe_asset(const std::string& account);
22+
virtual void set_asset_changed_callback(const std::function<void(const tigeropen::push::pb::AssetData&)>& cb) = 0;
23+
virtual bool subscribe_asset(const std::string& account) = 0;
24+
virtual bool unsubscribe_asset(const std::string& account) = 0;
3725

3826
//TODO:other
39-
40-
private:
41-
bool send_frame(const tigeropen::push::pb::Request& request);
42-
void do_write(const std::string& frame);
43-
void do_disconnect();
44-
void on_message(const std::shared_ptr<tigeropen::push::pb::Response>& response_pb_object);
45-
private:
46-
std::function<void(const tigeropen::push::pb::AssetData&)> asset_changed_;
47-
private:
48-
boost::asio::io_service io_service_;
49-
std::shared_ptr<TIGER_API::PushSocket> socket_;
50-
std::shared_ptr<std::thread> worker_thread_;
5127
};
5228
}
5329

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#ifndef PUSH_CLIENT_IMPL_H
2+
#define PUSH_CLIENT_IMPL_H
3+
4+
#include "boost/asio/io_service.hpp"
5+
#include "tigerapi/push_client.h"
6+
#include "tigerapi/client_config.h"
7+
#include "openapi_pb/pb_source/Request.pb.h"
8+
#include "openapi_pb/pb_source/Response.pb.h"
9+
10+
namespace TIGER_API
11+
{
12+
class PushSocket;
13+
class PushClientImpl : public std::enable_shared_from_this<PushClientImpl>, public IPushClient
14+
{
15+
public:
16+
static std::shared_ptr<PushClientImpl> create_push_client_impl(const TIGER_API::ClientConfig& client_config);
17+
~PushClientImpl();
18+
PushClientImpl(const PushClientImpl&) = delete;
19+
PushClientImpl& operator=(const PushClientImpl&) = delete;
20+
private:
21+
PushClientImpl(const TIGER_API::ClientConfig& client_config);
22+
public:
23+
virtual void connect() override;
24+
virtual void disconnect() override;
25+
26+
virtual void set_connected_callback(const std::function<void()>& cb) override;
27+
virtual void set_disconnected_callback(const std::function<void()>& cb) override;
28+
virtual void set_inner_error_callback(const std::function<void(std::string)>& cb) override;
29+
30+
virtual void set_asset_changed_callback(const std::function<void(const tigeropen::push::pb::AssetData&)>& cb) override;
31+
virtual bool subscribe_asset(const std::string& account) override;
32+
virtual bool unsubscribe_asset(const std::string& account) override;
33+
private:
34+
bool send_frame(const tigeropen::push::pb::Request& request);
35+
void do_write(const std::string& frame);
36+
void do_disconnect();
37+
void on_message(const std::shared_ptr<tigeropen::push::pb::Response>& response_pb_object);
38+
private:
39+
std::function<void(const tigeropen::push::pb::AssetData&)> asset_changed_;
40+
private:
41+
ClientConfig client_config_;
42+
boost::asio::io_service io_service_;
43+
std::shared_ptr<TIGER_API::PushSocket> socket_;
44+
std::shared_ptr<std::thread> worker_thread_;
45+
};
46+
47+
std::shared_ptr<TIGER_API::IPushClient> IPushClient::create_push_client(const TIGER_API::ClientConfig& client_config)
48+
{
49+
return PushClientImpl::create_push_client_impl(client_config);
50+
}
51+
}
52+
53+
#endif // PUSH_CLIENT_IMPL_H

openapi-cpp-sdk.vcxproj

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@
9898
<GenerateDebugInformation>true</GenerateDebugInformation>
9999
<EnableUAC>false</EnableUAC>
100100
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
101-
<AdditionalLibraryDirectories>$(SolutionDir)output\$(Configuration)\;..\vcpkg\installed\x86-windows\debug\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
101+
<AdditionalLibraryDirectories>$(SolutionDir)output\$(Configuration)\;..\vcpkg\installed\x86-windows\debug\lib;lib\x86\$(Configuration)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
102102
<AdditionalDependencies>libssl.lib;libcrypto.lib;zlibd.lib;cpprest_2_10d.lib;libprotobufd.lib;%(AdditionalDependencies)</AdditionalDependencies>
103103
</Link>
104104
</ItemDefinitionGroup>
@@ -118,7 +118,7 @@
118118
<GenerateDebugInformation>true</GenerateDebugInformation>
119119
<EnableUAC>false</EnableUAC>
120120
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
121-
<AdditionalLibraryDirectories>$(SolutionDir)output\$(Platform)\$(Configuration)\;..\vcpkg\installed\x64-windows\debug\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
121+
<AdditionalLibraryDirectories>$(SolutionDir)output\$(Platform)\$(Configuration)\;..\vcpkg\installed\x64-windows\debug\lib;lib\x64\$(Configuration)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
122122
<AdditionalDependencies>libssl.lib;libcrypto.lib;zlibd.lib;cpprest_2_10d.lib;libprotobufd.lib;%(AdditionalDependencies)</AdditionalDependencies>
123123
</Link>
124124
</ItemDefinitionGroup>
@@ -143,7 +143,7 @@
143143
<EnableUAC>false</EnableUAC>
144144
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
145145
<AdditionalDependencies>libssl.lib;libcrypto.lib;zlib.lib;cpprest_2_10.lib;libprotobuf.lib;%(AdditionalDependencies)</AdditionalDependencies>
146-
<AdditionalLibraryDirectories>$(SolutionDir)output\$(Configuration)\;..\vcpkg\installed\x86-windows\lib</AdditionalLibraryDirectories>
146+
<AdditionalLibraryDirectories>$(SolutionDir)output\$(Configuration)\;..\vcpkg\installed\x86-windows\lib;lib\x86\$(Configuration)\</AdditionalLibraryDirectories>
147147
</Link>
148148
</ItemDefinitionGroup>
149149
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -167,7 +167,7 @@
167167
<EnableUAC>false</EnableUAC>
168168
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
169169
<AdditionalDependencies>libssl.lib;libcrypto.lib;zlib.lib;cpprest_2_10.lib;libprotobuf.lib;%(AdditionalDependencies)</AdditionalDependencies>
170-
<AdditionalLibraryDirectories>$(SolutionDir)output\$(Platform)\$(Configuration)\;..\vcpkg\installed\x64-windows\lib</AdditionalLibraryDirectories>
170+
<AdditionalLibraryDirectories>$(SolutionDir)output\$(Platform)\$(Configuration)\;..\vcpkg\installed\x64-windows\lib;lib\x64\$(Configuration)\</AdditionalLibraryDirectories>
171171
</Link>
172172
</ItemDefinitionGroup>
173173
<ItemGroup>
@@ -372,6 +372,7 @@
372372
<ClInclude Include="include\tigerapi\model.h" />
373373
<ClInclude Include="include\tigerapi\order_util.h" />
374374
<ClInclude Include="include\tigerapi\push_client.h" />
375+
<ClInclude Include="include\tigerapi\push_socket\push_client_impl.h" />
375376
<ClInclude Include="include\tigerapi\push_socket\push_frame_serialize.h" />
376377
<ClInclude Include="include\tigerapi\push_socket\push_socket.h" />
377378
<ClInclude Include="include\tigerapi\quote_client.h" />
@@ -407,7 +408,7 @@
407408
<ClCompile Include="src\contract_util.cpp" />
408409
<ClCompile Include="src\easylogging++.cc" />
409410
<ClCompile Include="src\order_util.cpp" />
410-
<ClCompile Include="src\push_client.cpp" />
411+
<ClCompile Include="src\push_socket\push_client_impl.cpp" />
411412
<ClCompile Include="src\push_socket\push_frame_serialize.cpp" />
412413
<ClCompile Include="src\push_socket\push_socket.cpp" />
413414
<ClCompile Include="src\quote_client.cpp" />

openapi-cpp-sdk.vcxproj.filters

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -666,15 +666,18 @@
666666
<ClInclude Include="include\openapi_pb\pb_source\TradeTickData.pb.h">
667667
<Filter>include\openapi_pb\pb_source</Filter>
668668
</ClInclude>
669-
<ClInclude Include="include\tigerapi\push_client.h">
670-
<Filter>include\tigerapi</Filter>
671-
</ClInclude>
672669
<ClInclude Include="include\tigerapi\push_socket\push_frame_serialize.h">
673670
<Filter>include\tigerapi\push_socket</Filter>
674671
</ClInclude>
675672
<ClInclude Include="include\tigerapi\push_socket\push_socket.h">
676673
<Filter>include\tigerapi\push_socket</Filter>
677674
</ClInclude>
675+
<ClInclude Include="include\tigerapi\push_client.h">
676+
<Filter>include\tigerapi</Filter>
677+
</ClInclude>
678+
<ClInclude Include="include\tigerapi\push_socket\push_client_impl.h">
679+
<Filter>include\tigerapi\push_socket</Filter>
680+
</ClInclude>
678681
</ItemGroup>
679682
<ItemGroup>
680683
<ClCompile Include="src\contract_util.cpp">
@@ -752,15 +755,15 @@
752755
<ClCompile Include="include\openapi_pb\pb_source\TradeTickData.pb.cc">
753756
<Filter>include\openapi_pb\pb_source</Filter>
754757
</ClCompile>
755-
<ClCompile Include="src\push_client.cpp">
756-
<Filter>src</Filter>
757-
</ClCompile>
758758
<ClCompile Include="src\push_socket\push_frame_serialize.cpp">
759759
<Filter>src\push_socket</Filter>
760760
</ClCompile>
761761
<ClCompile Include="src\push_socket\push_socket.cpp">
762762
<Filter>src\push_socket</Filter>
763763
</ClCompile>
764+
<ClCompile Include="src\push_socket\push_client_impl.cpp">
765+
<Filter>src\push_socket</Filter>
766+
</ClCompile>
764767
</ItemGroup>
765768
<ItemGroup>
766769
<None Include="include\cpprest\details\http_constants.dat">
Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
#include "tigerapi/push_client.h"
1+
#include "tigerapi/push_socket/push_client_impl.h"
22
#include "tigerapi/client_config.h"
33
#include "tigerapi/push_socket/push_socket.h"
44
#include "openapi_pb\pb_source\PushData.pb.h"
55
#include <iostream>
66
#include "google/protobuf/util/json_util.h"
77

8-
std::shared_ptr<TIGER_API::PushClient> TIGER_API::PushClient::create_push_client(const TIGER_API::ClientConfig& client_config)
8+
std::shared_ptr<TIGER_API::PushClientImpl> TIGER_API::PushClientImpl::create_push_client_impl(const TIGER_API::ClientConfig& client_config)
99
{
10-
return std::shared_ptr<TIGER_API::PushClient>(new TIGER_API::PushClient());
10+
return std::shared_ptr<TIGER_API::PushClientImpl>(new TIGER_API::PushClientImpl(client_config));
1111
}
1212

13-
TIGER_API::PushClient::~PushClient()
13+
TIGER_API::PushClientImpl::~PushClientImpl()
1414
{
1515
io_service_.stop();
1616

@@ -20,61 +20,62 @@ TIGER_API::PushClient::~PushClient()
2020
}
2121
}
2222

23-
TIGER_API::PushClient::PushClient()
23+
TIGER_API::PushClientImpl::PushClientImpl(const TIGER_API::ClientConfig& client_config)
24+
:client_config_(client_config)
2425
{
2526

2627
}
2728

28-
void TIGER_API::PushClient::connect(const TIGER_API::ClientConfig& client_config)
29+
void TIGER_API::PushClientImpl::connect()
2930
{
3031
LOG(INFO) << "create a worker thread to perform asynchronous network connections";
3132
//启动工作线程
32-
worker_thread_ = std::shared_ptr<std::thread>(new std::thread([this, client_config]
33+
worker_thread_ = std::shared_ptr<std::thread>(new std::thread([this]
3334
{
34-
socket_ = PushSocket::create_push_socket(&io_service_, client_config);
35+
socket_ = PushSocket::create_push_socket(&io_service_, client_config_);
3536
socket_->connect();
3637

3738
LOG(INFO) << "io_service run on work thread";
3839
io_service_.run();
3940
}));
4041
}
4142

42-
void TIGER_API::PushClient::disconnect()
43+
void TIGER_API::PushClientImpl::disconnect()
4344
{
4445
//跨线程调用,需要异步投递任务
45-
io_service_.post(boost::bind(&PushClient::do_disconnect, this));
46+
io_service_.post(boost::bind(&PushClientImpl::do_disconnect, this));
4647
}
4748

48-
void TIGER_API::PushClient::set_connected_callback(const std::function<void()>& cb)
49+
void TIGER_API::PushClientImpl::set_connected_callback(const std::function<void()>& cb)
4950
{
5051
if (socket_)
5152
{
5253
socket_->set_connected_callback(cb);
5354
}
5455
}
5556

56-
void TIGER_API::PushClient::set_disconnected_callback(const std::function<void()>& cb)
57+
void TIGER_API::PushClientImpl::set_disconnected_callback(const std::function<void()>& cb)
5758
{
5859
if (socket_)
5960
{
6061
socket_->set_disconnected_callback(cb);
6162
}
6263
}
6364

64-
void TIGER_API::PushClient::set_inner_error_callback(const std::function<void(std::string)>& cb)
65+
void TIGER_API::PushClientImpl::set_inner_error_callback(const std::function<void(std::string)>& cb)
6566
{
6667
if (socket_)
6768
{
6869
socket_->set_inner_error_callback(cb);
6970
}
7071
}
7172

72-
void TIGER_API::PushClient::set_asset_changed_callback(const std::function<void(const tigeropen::push::pb::AssetData&)>& cb)
73+
void TIGER_API::PushClientImpl::set_asset_changed_callback(const std::function<void(const tigeropen::push::pb::AssetData&)>& cb)
7374
{
7475
asset_changed_ = cb;
7576
}
7677

77-
bool TIGER_API::PushClient::subscribe_asset(const std::string& account)
78+
bool TIGER_API::PushClientImpl::subscribe_asset(const std::string& account)
7879
{
7980
if (!socket_)
8081
{
@@ -97,7 +98,7 @@ bool TIGER_API::PushClient::subscribe_asset(const std::string& account)
9798
return true;
9899
}
99100

100-
bool TIGER_API::PushClient::unsubscribe_asset(const std::string& account)
101+
bool TIGER_API::PushClientImpl::unsubscribe_asset(const std::string& account)
101102
{
102103
if (!socket_)
103104
{
@@ -120,7 +121,7 @@ bool TIGER_API::PushClient::unsubscribe_asset(const std::string& account)
120121
return true;
121122
}
122123

123-
bool TIGER_API::PushClient::send_frame(const tigeropen::push::pb::Request& request)
124+
bool TIGER_API::PushClientImpl::send_frame(const tigeropen::push::pb::Request& request)
124125
{
125126
//序列化pb对象到字符串
126127
std::string packed_frame = request.SerializeAsString();
@@ -136,28 +137,28 @@ bool TIGER_API::PushClient::send_frame(const tigeropen::push::pb::Request& reque
136137
LOG(DEBUG) << "send frame:" << packed_frame_json;
137138

138139
//跨线程,异步投递任务
139-
io_service_.post(boost::bind(&PushClient::do_write, this, packed_frame));
140+
io_service_.post(boost::bind(&PushClientImpl::do_write, this, packed_frame));
140141

141142
return true;
142143
}
143144

144-
void TIGER_API::PushClient::do_write(const std::string& frame)
145+
void TIGER_API::PushClientImpl::do_write(const std::string& frame)
145146
{
146147
if (socket_)
147148
{
148149
socket_->send_message(frame);
149150
}
150151
}
151152

152-
void TIGER_API::PushClient::do_disconnect()
153+
void TIGER_API::PushClientImpl::do_disconnect()
153154
{
154155
if (socket_)
155156
{
156157
socket_->disconnect();
157158
}
158159
}
159160

160-
void TIGER_API::PushClient::on_message(const std::shared_ptr<tigeropen::push::pb::Response>& response_pb_object)
161+
void TIGER_API::PushClientImpl::on_message(const std::shared_ptr<tigeropen::push::pb::Response>& response_pb_object)
161162
{
162163
if (response_pb_object->body().datatype() == tigeropen::push::pb::SocketCommon_DataType_Asset && asset_changed_)
163164
{

0 commit comments

Comments
 (0)