wss协议 c 服务器,利用LIBWEBSOCKETS写WS、WSS服务端和客户端

本文介绍了如何使用libwebsockets库创建WS和WSS服务端与客户端。通过示例代码展示了libwebsockets的使用,包括服务端的LWS_CALLBACK_ESTABLISHED、LWS_CALLBACK_RECEIVE和LWS_CALLBACK_SERVER_WRITEABLE回调,以及客户端的连接、接收和发送数据。
摘要由CSDN通过智能技术生成

libwebsockets是一款轻量级用来开发服务器和客户端的C库。按照官方(https://libwebsockets.org/)给出的介绍来看,它不仅支持ws,wss还同时支持http与https,可以轻轻松松结合openssl等库来实现ssl加密。

实现websocket服务本身也是libwebsockets库的初衷,本篇文章将讲解如何利用libwebsockets写ws、wss服务端和客户端。

服务端:

server.c#include "libwebsockets.h"

#include 

#include 

static volatile int exit_sig = 0;

#define MAX_PAYLOAD_SIZE  10 * 1024

void sighdl( int sig ) {

lwsl_notice( "%d traped", sig );

exit_sig = 1;

}

/**

* 会话上下文对象,结构根据需要自定义

*/

struct session_data {

int msg_count;

unsigned char buf[LWS_PRE + MAX_PAYLOAD_SIZE];

int len;

bool bin;

bool fin;

};

static int protocol_my_callback( struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len ) {

struct session_data *data = (struct session_data *) user;

switch ( reason ) {

case LWS_CALLBACK_ESTABLISHED:       // 当服务器和客户端完成握手后

printf("Client connect!\n");

break;

case LWS_CALLBACK_RECEIVE:           // 当接收到客户端发来的帧以后

// 判断是否最后一帧

data->fin = lws_is_final_fragment( wsi );

// 判断是否二进制消息

data->bin = lws_frame_is_binary( wsi );

// 对服务器的接收端进行流量控制,如果来不及处理,可以控制之

// 下面的调用禁止在此连接上接收数据

lws_rx_flow_control( wsi, 0 );

// 业务处理部分,为了实现Echo服务器,把客户端数据保存起来

memcpy( &data->buf[ LWS_PRE ], in, len );

data->len = len;

printf("recvied message:%s\n",in);

// 需要给客户端应答时,触发一次写回调

lws_callback_on_writab

WebSocket是一种在单个TCP连接上进行全双工通信的协议,它允许服务器主动向客户端推送信息。创建WebSocket客户端服务端来建立长连接,通常涉及以下步骤: 1. **WebSocket服务端创建**: - 首先,需要选择一个支持WebSocket的服务器端语言和框架,比如Node.js、Java、Python等。 - 在服务器端,使用相应的库或框架提供的API创建WebSocket服务,监听一个端口来接收来自客户端的连接请求。 - 一旦有客户端连接,服务器就可以根据需要向客户端发送消息。 2. **WebSocket客户端创建**: - 在客户端(例如浏览器中的JavaScript),同样需要使用WebSocket相关的API来建立与服务端的连接。 - 通过指定服务端WebSocket URL来初始化一个WebSocket连接。 - 客户端连接建立后,可以监听服务端发来的消息,并可以发送消息到服务端。 3. **消息的发送与接收**: - 在服务端客户端建立连接后,双方都可以发送消息。 - 客户端可以使用`socket.send()`方法发送消息到服务端服务端也可以使用类似的方法发送消息到客户端。 - 双方都需要监听消息事件来接收对方发送过来的数据。 4. **连接的关闭**: - 当不再需要连接时,可以通过调用`socket.close()`方法来关闭WebSocket连接。 下面是一个简单的示例: **Node.js WebSocket服务端示例代码**: ```javascript const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', function connection(ws) { ws.on('message', function incoming(message) { console.log('received: %s', message); ws.send('echo: ' + message); }); ws.send('Hello Client!'); }); ``` **HTML5 WebSocket客户端示例代码**: ```html <!DOCTYPE html> <html> <head> <title>WebSocket Client</title> </head> <body> <script> var socket = new WebSocket('ws://localhost:8080'); socket.onmessage = function(event) { var message = event.data; console.log('received: %s', message); }; socket.onopen = function(event) { socket.send('Hello Server!'); }; </script> </body> </html> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值