websocket++简单使用及实例分析_C 语言

前言

html5支持使用websocket协议与服务器保持一个长连接,方便双方互相传输数据,而且服务器也能主动发送信息给客户端,而在这之前使用HTTP是很难做到的。下面介绍使用C++实现的websocket++的简单使用。websocket++更详细介绍点此。

websocket++需要boost的支持,所以工程中需要包含boost的头文件和库。boost在VS中的如何使用参考此文章。

C++代码

#include "stdafx.h"
#include <iostream>

using namespace std;

#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>

typedef websocketpp::server<websocketpp::config::asio> WebsocketServer;
typedef WebsocketServer::message_ptr message_ptr;

using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;

void OnOpen(WebsocketServer *server, websocketpp::connection_hdl hdl)
{
  cout << "have client connected" << endl;
}

void OnClose(WebsocketServer *server, websocketpp::connection_hdl hdl)
{
  cout << "have client disconnected" << endl;
}

void OnMessage(WebsocketServer *server, websocketpp::connection_hdl hdl, message_ptr msg)
{
  string strMsg = msg->get_payload();
  cout << strMsg << endl;

  string strRespon = "receive: ";
  strRespon.append(strMsg);

  server->send(hdl, strRespon, websocketpp::frame::opcode::text);
}

int main()
{
  WebsocketServer          server;

  // Set logging settings
  server.set_access_channels(websocketpp::log::alevel::all);
  server.clear_access_channels(websocketpp::log::alevel::frame_payload);

  // Initialize ASIO
  server.init_asio();

  // Register our open handler
  server.set_open_handler(bind(&OnOpen, &server, ::_1));

  // Register our close handler
  server.set_close_handler(bind(&OnClose, &server, _1));

  // Register our message handler
  server.set_message_handler(bind(&OnMessage, &server, _1, _2));

  //Listen on port 2152
  server.listen(8090);

  //Start the server accept loop
  server.start_accept();

  //Start the ASIO io_service run loop
  server.run();

  return 0;
}

Html代码

<!DOCTYPE html>
<html>
<head>
<title>Testing websockets</title>
</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:8090');

  webSocket.onerror = function(event) {
   onError(event)
  };

  webSocket.onopen = function(event) {
   onOpen(event)
  };

  webSocket.onclose = function(event) {
   onClose(event)
  };

  webSocket.onmessage = function(event) {
   onMessage(event)
  };

  function onMessage(event) {
   document.getElementById('messages').innerHTML
    += '<br />' + event.data;
  }

  function onOpen(event) {
   document.getElementById('messages').innerHTML
    = 'Connection established';
  }

  function onClose(event) {
   document.getElementById('messages').innerHTML
    += '<br />disconnection';
  }
  function onError(event) {
   alert(event.data);
  }

  function start() {
   webSocket.send('hello');
   return false;
  }
 </script>
</body>
</html>

运行结果

 

以上这篇websocket++简单使用及实例分析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索websocket
简单例子
websocket简单实例、c语言socket编程实例、go语言实现socket实例、java socket简单实例、c语言socket实例,以便于您获取更多的相关知识。

时间: 2024-09-20 05:12:36

websocket++简单使用及实例分析_C 语言的相关文章

C语言的递归思想实例分析_C 语言

本文实例分析C语言的递归思想,分享给大家供大家参考之用.具体方法如下: 通俗点来说,递归就是自己调用自己. 递归的难点一是理解递归的执行调用过程,二是设置一个合理的递归结束条件. 下面来看一段摘自书中的简单程序: #include <STDIO.H> long fact(int n); long rfact(int n); int main(void) { int num; printf("This program calculates factorials.\n"); p

C++编译器无法捕捉到的8种错误实例分析_C 语言

本文实例分析了C++编译器无法捕捉到的8种错误,分享给大家供大家参考之用.有助于深入理解C++运行原理,具体分析如下: 众所周知,C++是一种复杂的编程语言,其中充满了各种微妙的陷阱.在C++中几乎有数不清的方式能把事情搞砸.幸运的是,如今的编译器已经足够智能化了,能够检测出相当多的这类编程陷阱并通过编译错误或编译警告来通知程序员.最终,如果处理得当的话,任何编译器能检查到的错误都不会是什么大问题,因为它们在编译时会被捕捉到,并在程序真正运行前得到解决.最坏的情况下,一个编译器能够捕获到的错误只

C++线程同步实例分析_C 语言

本文实例分析了C++线程同步问题,分享给大家供大家参考.具体分析如下: 该实例设置全局变量g_bContinue,在主线程中设置全局变量g_bContinue,工作线程检测该全局变量,实现主线程控制工作线程的目的. 打印出的g_cnt1与g_cnt2的数值不同,是因为线程调试时时间片的切换. 具体代码如下: // countError.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h> DWORD

C++回溯法实例分析_C 语言

本文实例讲述了C++的回溯法,分享给大家供大家参考之用.具体方法分析如下: 一般来说,回溯法是一种枚举状态空间中所有可能状态的系统方法,它是一个一般性的算法框架. 解向量a=(a1, a2, ..., an),其中每个元素ai取自一个有限序列集Si,这样的解向量可以表示一个排列,其中ai是排列中的第i个元素,也可以表示子集S,其中ai为真当且仅当全集中的第i个元素在S中:甚至可以表示游戏的行动序列或者图中的路径. 在回溯法的每一步,我们从一个给定的部分解a={a1, a2, ..., ak}开始

C++二进制翻转实例分析_C 语言

本文实例讲述了C++二进制翻转的方法,将常用的几种解决方法罗列出来供大家比较选择.具体如下: 首先来看看一个相对笨拙的算法: #include <iostream> using namespace std; void printBinary(unsigned char str, int size = 1) { int flag = 0x01; for (int i = 0; i < size; i++) { for (int i = 0; i < 8; i++) { if (str

C语言创建链表错误之通过指针参数申请动态内存实例分析_C 语言

本文实例讲述了C语言创建链表中经典错误的通过指针参数申请动态内存,分享给大家供大家参考之用.具体实例如下: #include <stdio.h> #include <stdlib.h>// 用malloc要包含这个头文件 typedef struct node { int data; struct node* next;// 这个地方注意结构体变量的定义规则 } Node; void createLinklist(Node* pHder, int length) { int i =

C语言中自动隐式转换与类型强制转换实例分析_C 语言

本文通过一个C程序实例对C语言中自动隐式转换与类型强制转换的注意点进行深入分析,详情如下: 先看一个C程序: #include<stdlib.h> #include<stdio.h> #include<conio.h> double proc(int q){ int n; double sum,t;//本例的关键就在这几个变量的类型上 sum = 2.0; while(sum<=q){ t=sum; //sum = sum+(n+1)/n;//自动隐式转换 sum

C++虚函数表实例分析_C 语言

多态是C++面向对象程序设计的一个重要特性.以前看到虚函数觉得很神奇,为什么就能实现多态了呢.最初的时候曾设想,要实现运行时多态,应该让对象的某个部分始终指向一个固定的地址,子类继承的时候,就修改这个地址的内容.这样,父类和子类都是到同一个固定地址去读取内容,在运行时就能表现不同行为. 在看了<深度探索c++对象模型>之后,发现思路是类似的.在对象中,有一个指针指向一张虚函数表,里面按照次序存放了每一个虚函数,当子类继承的时候,即到虚函数表的指定位置去修改函数地址.当我们通过父类指针来操作一个

C++对数组的引用实例分析_C 语言

C++中所谓数组引用,即指向数组的引用: 如: int a[10] ; int (&b)[10] = a ; 如果写成: int a[10] ; int* &b = a ; 系统将会报错: cannot convert from 'int [10]' to 'int *&'. 或许你会说在数组名不就是指向这个数组的一个指针吗?题中a是int*类型的,b是指向int*的引用,按理应该是正确的啊,为什么会报错呢?这是因为编译器对指向数组的引用检查更加严格,需要检查数组的维数,在这里a被