ws客户端与服务器发送的内容有差异,服务器直接发送的消息正常显示,客户端发送的消息服务器显示收到发送内容+eflate; client_max_window_bits如果再次输入更长的内容可能出现"一些字符e; client_max_window_bits""类似的情况,如果字符串更长会收到字符串+Upgrade Pragma: no-cache Cache-Control: no-cache User-Agent: Mozilla/5.0 (Linux; Android 11; 220233L2C Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/97.0.4692.98 Mobile Safari/537.36 Upgrade: websocket Origin: null Sec-WebSocket-Version: 13 Accept-Encoding: gzip, deflate Accept-LanguageHTTP/1.1 101 Switching Protocols Upgrade: WebSocket Connection: Upgrade Sec-WebSocket-Accept: DrV91jrOPUr7fYeB+90T/XOxqF0=
服务器代码如下
#include <libwebsockets.h>
#include <string.h>
#define MAX_CLIENTS 10
#define LWS_PROTOCOL_NAME "my-protocol"
#define RX_BUFFER_BYTES 8500
#define TX_BUFFER_BYTES 1024
static struct lws *clients[MAX_CLIENTS];
static int client_count = 0;
char str[RX_BUFFER_BYTES];
static int send_to_all_clients(const char *msg, size_t len);
void c() { if (str != NULL) {
for (int i = 0;i<RX_BUFFER_BYTES; i++) {
str[i] = '\0';
}
}
}
static int callback_my_protocol(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) {
switch (reason) {
case LWS_CALLBACK_ESTABLISHED:
if (client_count < MAX_CLIENTS) {
clients[client_count++] = wsi;
lwsl_notice("Client connected\n");
char message[] = "server.8:测试,成功";
send_to_all_clients(message, strlen(message));
} else {
lwsl_notice("Too many clients\n");
return -1;
}
break;
case LWS_CALLBACK_RECEIVE:
if (len < RX_BUFFER_BYTES - strlen(str))
{
c();
strcat(str, (char *)in);
puts(str);
send_to_all_clients(str, strlen(str));
} else {
lwsl_notice("Buffer full\n");
}
break;
case LWS_CALLBACK_CLOSED:
for (int i = 0; i < client_count; i++) {
if (clients[i] == wsi) {
memmove(clients + i, clients + i + 1, (client_count - i - 1) * sizeof(struct lws *));
client_count--;
break;
}
}
lwsl_notice("Client disconnected\n");
break;
default:
break;
}
return 0;
}
static int send_to_all_clients(const char *msg, size_t len) {
for (int i = 0; i < client_count; i++) {
lws_write(clients[i], (unsigned char *)msg, len, LWS_WRITE_TEXT);
}
return 0;
}
static struct lws_protocols protocols[] = {
{
.name = LWS_PROTOCOL_NAME,
.callback = callback_my_protocol,
.per_session_data_size = 0,
.rx_buffer_size = RX_BUFFER_BYTES
},
{NULL, NULL, 0, 0}
};
int main() {
struct lws_context_creation_info info;
memset(&info, 0, sizeof(info));
info.port = 7681;
info.protocols = protocols;
info.extensions = NULL;
info.gid = -1;
info.uid = -1;
struct lws_context *context = lws_create_context(&info);
if (context == NULL) {
lwsl_err("lws init failed\n");
return -1;
}
while (1) {
lws_service(context, 50);
}
lws_context_destroy(context);
return 0;
}
客户端代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>WebSocket</title>
</head>
<body>
<div id="messageContainer">
<p>等待服务器消息...</p>
</div>
<input type="text" id="messageInput" placeholder="输入消息...">
<button id="sendButton">发送</button>
<script>
var ws = new WebSocket("ws://127.0.0.1:7681");
ws.onopen = function() {
console.log("连接已打开");
};
// 接收到服务器消息
ws.onmessage = function(event) {
var p = document.createElement("p");
p.textContent = "服务器消息: " + event.data;
document.getElementById("messageContainer").appendChild(p);
};
ws.onclose = function() {
console.log("连接已关闭");
};
ws.onerror = function(error) {
console.log("连接出错: " + error);
};
document.getElementById("sendButton").onclick = function() {
var message ="";
var message = document.getElementById("messageInput").value;
ws.send(message);
document.getElementById("messageInput").value = "";
};
</script>
</body>
</html>