webservercontrol.cpp 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. #include "webservercontrol.h"
  2. #include <QNetworkAccessManager>
  3. #include <QNetworkRequest>
  4. #include <QNetworkReply>
  5. #include <QtWebSockets>
  6. #include <QtCore>
  7. #include <cstdio>
  8. #include <time.h>
  9. #include "platformobject.h"
  10. using namespace std;
  11. WebServerControl *WebServerControl::m_pWebServerControl = nullptr;
  12. WebServerControl::WebServerControl(QObject *parent)
  13. : QObject(parent)
  14. {
  15. /*m_pWebSocketServer = new QWebSocketServer(QStringLiteral("WebServerControl Server"),
  16. QWebSocketServer::NonSecureMode,this);
  17. if (m_pWebSocketServer->listen(QHostAddress::Any, port))
  18. {
  19. QTextStream(stdout) << "Chat Server listening on port " << port << '\n';
  20. connect(m_pWebSocketServer, &QWebSocketServer::newConnection,
  21. this, &WebServerControl::onNewConnection);
  22. }*/
  23. m_pBinancePlatformObject = nullptr;
  24. }
  25. WebServerControl::WebServerControl( quint16 port, QObject *parent /*= nullptr*/ )
  26. {
  27. }
  28. WebServerControl::~WebServerControl()
  29. {
  30. if (m_pWebSocketServer)
  31. {
  32. m_pWebSocketServer->close();
  33. }
  34. }
  35. void WebServerControl::InitQWebSocketServer( quint16 port )
  36. {
  37. m_pWebSocketServer = new QWebSocketServer(QStringLiteral("WebServerControl Server"),
  38. QWebSocketServer::NonSecureMode,this);
  39. if (m_pWebSocketServer->listen(QHostAddress::Any, port))
  40. {
  41. QTextStream(stdout) << "Chat Server listening on port " << port << '\n';
  42. connect(m_pWebSocketServer, &QWebSocketServer::newConnection,
  43. this, &WebServerControl::onNewConnection);
  44. }
  45. }
  46. WebServerControl* WebServerControl::GetInstance()
  47. {
  48. if (m_pWebServerControl == nullptr)
  49. {
  50. m_pWebServerControl = new WebServerControl();
  51. }
  52. return m_pWebServerControl;
  53. }
  54. void WebServerControl::FreeInstance()
  55. {
  56. if (m_pWebServerControl)
  57. {
  58. delete m_pWebServerControl;
  59. m_pWebServerControl = nullptr;
  60. }
  61. }
  62. void WebServerControl::onNewConnection()
  63. {
  64. auto pSocket = m_pWebSocketServer->nextPendingConnection();
  65. //QTextStream(stdout) << getIdentifier(pSocket) << " connected!\n";
  66. pSocket->setParent(this);
  67. // 对连接进来的每一个进行信号槽连接绑定
  68. connect(pSocket, &QWebSocket::binaryMessageReceived,
  69. this, &WebServerControl::processMessage);
  70. connect(pSocket, &QWebSocket::textMessageReceived,
  71. this, &WebServerControl::processMessageText);
  72. connect(pSocket, &QWebSocket::disconnected,
  73. this, &WebServerControl::socketDisconnected);
  74. // 使用 list 进行管理,方便断开
  75. m_vClients.push_back(pSocket);
  76. }
  77. void WebServerControl::processMessage( const QByteArray &message )
  78. {
  79. QWebSocket *pSender = qobject_cast<QWebSocket *>(sender());
  80. QWebSocket *pClient = nullptr;
  81. for (int i = 0;i < m_vClients.size();i++)
  82. {
  83. pClient = m_vClients.at(i);
  84. if (pClient == pSender)
  85. {
  86. pClient->sendTextMessage(message + " @ host echo ");
  87. //qDebug() << "peer address = " << pClient->peerAddress();
  88. Parse_Now_Json(message);
  89. }
  90. }
  91. }
  92. void WebServerControl::socketDisconnected()
  93. {
  94. QWebSocket *pSender = qobject_cast<QWebSocket *>(sender());
  95. if (pSender)
  96. {
  97. auto it = m_vClients.begin();
  98. for (; it != m_vClients.end();it++)
  99. {
  100. QWebSocket *pClient = *it;
  101. if (pClient == pSender)
  102. {
  103. m_vClients.erase(it);
  104. pClient->deleteLater();
  105. break;
  106. }
  107. }
  108. }
  109. }
  110. void WebServerControl::InitHeadCooko()
  111. {
  112. // 假设你已经有了一个QNetworkAccessManager实例
  113. QNetworkAccessManager *pManager = new QNetworkAccessManager(this);
  114. // 发起一个HTTP GET请求来获取cookie
  115. QNetworkRequest request(QUrl("http://example.com"));
  116. pManager->get(request);
  117. // 连接信号和槽,以处理获取的cookie
  118. connect(pManager, &QNetworkAccessManager::finished, [&](QNetworkReply *reply)
  119. {
  120. if(reply->error() == QNetworkReply::NoError)
  121. {
  122. // 获取Set-Cookie头部
  123. //QList<QNetworkCookie> cookies = reply->header(QNetworkRequest::SetCookieHeader).cookies();
  124. //QString cookie;
  125. //for(const QNetworkCookie &ck : cookies)
  126. //{
  127. // cookie += ck.toRawForm(); // 将cookie转换为字符串
  128. //}
  129. //// 使用获取到的cookie来建立WebSocket连接
  130. //QWebSocket *pWebSocket = new QWebSocket(QUrl("ws://example.com"), this);
  131. //pWebSocket->setCookiesFromUrl(QList<QNetworkCookie>() << QNetworkCookie(cookie));
  132. //pWebSocket->open(QUrl("ws://example.com").toEncoded());
  133. //// 处理webSocket的连接和数据
  134. //// ...
  135. }
  136. reply->deleteLater(); // 请求完成后删除reply对象
  137. });
  138. }
  139. void WebServerControl::Parse_Now_Json( const QByteArray &arrayjson )
  140. {
  141. QJsonParseError err_rpt;
  142. QJsonDocument root_Doc = QJsonDocument::fromJson(arrayjson, &err_rpt);//字符串格式化为JSON
  143. if(err_rpt.error != QJsonParseError::NoError)
  144. {
  145. qDebug() << "JSON格式错误";
  146. return;
  147. }
  148. else //JSON格式正确
  149. {
  150. QJsonObject object = root_Doc.object();
  151. if (object.contains("platform") && object["platform"].isString())
  152. {
  153. QString strPaltform = object["platform"].toString(); // 数据类型
  154. DataPlatform item;
  155. item.strPlatformType = strPaltform;
  156. item.strSymbol = object["symbol"].toString();
  157. QJsonValue::Type tt = object["date"].type();
  158. item.nData = object["date"].toDouble();
  159. item.fPrice = object["price"].toDouble();
  160. InsertMapPlatObject(strPaltform,item);
  161. }
  162. }
  163. }
  164. void WebServerControl::processMessageText( const QString &message )
  165. {
  166. QWebSocket *pSender = qobject_cast<QWebSocket *>(sender());
  167. QWebSocket *pClient = nullptr;
  168. for (int i = 0;i < m_vClients.size();i++)
  169. {
  170. pClient = m_vClients.at(i);
  171. if (pClient == pSender)
  172. {
  173. pClient->sendTextMessage(message + " @ host echo ");
  174. //qDebug() << "peer address = " << pClient->peerAddress();
  175. float fStime = clock();
  176. Parse_Now_Json(message.toUtf8());
  177. float fStime2 = clock();
  178. //qDebug() << "Parse_Now_Json Time = " << fStime2 - fStime;
  179. }
  180. }
  181. }
  182. void WebServerControl::InsertMapPlatObject( QString strType,const DataPlatform &item )
  183. {
  184. PlatformObject* pObject = nullptr;
  185. auto it = m_mPlatformObjects.find(strType);
  186. if (it == m_mPlatformObjects.end())
  187. {
  188. pObject = new PlatformObject;
  189. pObject->SetPlatformName(strType);
  190. m_mPlatformObjects[strType] = pObject;
  191. if (strType == "Binance")
  192. {
  193. m_pBinancePlatformObject = pObject;
  194. }
  195. }
  196. else
  197. {
  198. pObject = it->second;
  199. }
  200. if (pObject)
  201. {
  202. pObject->MinData(item);
  203. }
  204. }
  205. //每隔两个小时计算一次
  206. void WebServerControl::CalcAver()
  207. {
  208. auto it = m_mPlatformObjects.begin();
  209. for (;it != m_mPlatformObjects.end();it++)
  210. {
  211. PlatformObject* pObject = it->second;
  212. if (pObject)
  213. {
  214. pObject->CalcAverageSelf();
  215. }
  216. }
  217. }
  218. void WebServerControl::CalcdeviationCompensation()
  219. {
  220. double dBinance = 0;
  221. if (m_pBinancePlatformObject)
  222. {
  223. if (m_pBinancePlatformObject)
  224. {
  225. dBinance = m_pBinancePlatformObject->GetDeviationCompensation();
  226. }
  227. }
  228. auto it = m_mPlatformObjects.begin();
  229. for (;it != m_mPlatformObjects.end();it++)
  230. {
  231. PlatformObject* pObject = it->second;
  232. if (pObject)
  233. {
  234. pObject->CalcdeviationCompensation(dBinance);
  235. }
  236. }
  237. }
  238. void WebServerControl::CalculateDeviationPercentage()
  239. {
  240. if (m_pBinancePlatformObject)
  241. {
  242. double dBNPrice = m_pBinancePlatformObject->GetRealPrice();
  243. auto it = m_mPlatformObjects.begin();
  244. for (;it != m_mPlatformObjects.end();it++)
  245. {
  246. PlatformObject* pObject = it->second;
  247. if (pObject != m_pBinancePlatformObject)
  248. {
  249. pObject->CalcdeviationPercentage(dBNPrice);
  250. pObject->executeTradingLogic(0.003);
  251. pObject->SetPostionState();//300ms判断是否要执行平仓
  252. }
  253. }
  254. }
  255. }
  256. void WebServerControl::ParseJson( const QByteArray &arrayjson )
  257. {
  258. QJsonParseError err_rpt;
  259. QJsonDocument root_Doc = QJsonDocument::fromJson(arrayjson, &err_rpt);//字符串格式化为JSON
  260. if(err_rpt.error != QJsonParseError::NoError)
  261. {
  262. qDebug() << "JSON格式错误";
  263. return;
  264. }
  265. else //JSON格式正确
  266. {
  267. QJsonObject object = root_Doc.object();
  268. if (object.contains("interfaceType"))
  269. {
  270. if (object["interfaceType"] == "trade_config")
  271. {
  272. m_ParameterSetting.ParseJson(arrayjson);
  273. }
  274. }
  275. }
  276. }