使用C++实现WebSocket服务的一个测试

来源:互联网 发布:淘宝bt种子 编辑:程序博客网 时间:2024/06/05 04:46

Author: kagula
Date: 2016-09-29

Envrionment
[1]Boost 1.61
[2]VS2013 Professional Update5
[3]Windows7 64bits SP1
[4]Chrome 53.0.2785.116
[5]Opera 40.0
[6]Tomcat 7.0.68
用来测试Java实现的Websocket服务,参考资料3。

Prologue
 测试Websocket++库实现Websocket服务技术上是否可行,这个库只依赖boost,使用的时候只要包含这个库的头文件就可以了。

Content
 [Step1]从Github的Master branch下载0.7.0
 [Step2]使用cmake在“D:\SDK\websocketpp-master070\2013”
下创建vs2013 sln文件。
 [Step3]
VS中新建Win32 Console Solution with Blank option.我取名为“MyEchoServer”
copy echo_server.cppecho_handler.hpp到新建的solution目录中,并把它们加入到solution中。
这两个文件在下面目录中
D:\SDK\websocketpp-master070\examples\echo_server
其中D:\SDK\websocketpp-master070是我压缩包的解压路径。
 [Step4]
头文件和库文件search path设置为
D:\SDK\boost_1_61_0
D:\SDK\boost_1_61_0\vc12\lib
因为我机器上有多种编译器,所以library被放在了vc12\lib下面。

依赖库设置为以下
boost_system-vc120-mt-1_61.lib
boost_thread-vc120-mt-1_61.lib
boost_random-vc120-mt-1_61.lib
boost_chrono-vc120-mt-1_61.lib
boost_date_time-vc120-mt-1_61.lib
boost_atomic-vc120-mt-1_61.lib

添加下面的宏定义
_SCL_SECURE_NO_WARNINGS

我使用Property Sheet文件,免得每个Websocket++项目我都要重建设置一遍。
 [Step5]Build Success.
复制下面6个文件到"D:\workspace\MyEchoServer\Debug"
boost_atomic-vc120-mt-1_61.dll
boost_chrono-vc120-mt-1_61.dll
boost_date_time-vc120-mt-1_61.dll
boost_random-vc120-mt-1_61.dll
boost_system-vc120-mt-1_61.dll
boost_thread-vc120-mt-1_61.dll
现在可以跑起来了。

 [Step6]参考上面的Steps新建MyEchoClient
源文件在"D:\SDK\websocketpp-master070\examples\echo_client"路径,就一个,编译并运行。
连接服务端成功。
 [Step7]
 让我们新建html页面,这样可以通过Browser测试C++实现的WebSocket服务是否可用。

<!DOCTYPE html>  <html>  <head>  <meta charset="UTF-8"></head>  <body>      <div>          <input type="submit" value="Start" onclick="start()" />      </div>      <div id="messages"></div>      <script type="text/javascript">          //var webSocket =  new WebSocket('ws://localhost:8080/testWebSocketProtocol/websocket');        var webSocket =  new WebSocket('ws://localhost:9002');          webSocket.onerror = function(event) {              onError(event)          };            webSocket.onopen = function(event) {              onOpen(event)          };            webSocket.onmessage = function(event) {              onMessage(event)          };            function onMessage(event) {              document.getElementById('messages').innerHTML                   += '<br />Get Message From Server: ' + event.data;          }            function onOpen(event) {              document.getElementById('messages').innerHTML                   = 'Connection established';          }            function onError(event) {              alert(event.data);              alert("error");          }            function start() {              webSocket.send('hello');              return false;          }      </script>  </body>  </html>  



 [Step8]
 在浏览器中采用下面两种方式浏览页面均成功链接用C++实现的Websocket服务端.
 “file:///D:/workspace_java/testWebSocketProtocol/WebContent/a.html”
 “http://localhost:8080/testWebSocketProtocol/a.html”

Remark:
[1]使用Java Spring4可以很容易的实现Websocket服务。
[2]websocket的链接数限制,IE5个。chrome250+左右,火狐200+左右!

FQA
Q Browser提示握手之前链接已经关闭。
A After i take two hours i found the cause, the solution is
shutdown Fan Qiang,then restart WebSocket Server and refresh Browser, the problem is disappear。

Reference:
[1]Websocket++ Official site
https://www.zaphoyd.com/websocketpp
《Creating a Websocket server with Websocket++》
[2]https://mayaposch.wordpress.com/2015/09/16/creating-a-websocket-server-with-websocket/
[3]《webSocket 入门demo》
Server端用java实现,没有用到任何第三方jar
http://hbiao68.iteye.com/blog/1973906

Appendix
[1]《spring websocket自动断开连接再创建引发的问题解决方案》
http://www.cnblogs.com/interdrp/p/4828573.html
[2]《Reconnecting Web Socket》
http://www.oschina.net/p/reconnectingwebsocket

0 0