C# WebSocket 后端代码:

using Newtonsoft.Json;
using SuperSocket.WebSocket;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms; namespace WebSocketServerHost
{
public partial class Form1 : Form
{
private WebSocketServer _server; private ConcurrentDictionary<string, WebSocketSession> _sessionList = new ConcurrentDictionary<string, WebSocketSession>(); private double _currentSpeed = 10; public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
try
{
_server = new WebSocketServer(); _server.NewSessionConnected += server_NewSessionConnected;
_server.NewMessageReceived += server_NewMessageReceived;
_server.SessionClosed += server_SessionClosed; _server.Setup("127.0.0.1", 40001);
_server.Start();
Log("WebSocket服务端启动成功");
}
catch (Exception ex)
{
Log("WebSocket服务端启动失败:" + ex.Message);
}
} #region Log
private void Log(string log)
{
if (!this.IsDisposed)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new Action(() =>
{
textBox1.AppendText(DateTime.Now.ToString("HH:mm:ss.fff") + " " + log + "\r\n\r\n");
}));
}
else
{
textBox1.AppendText(DateTime.Now.ToString("HH:mm:ss.fff") + " " + log + "\r\n\r\n");
}
}
} private void ClearLog()
{
if (!this.IsDisposed)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new Action(() =>
{
textBox1.Text = string.Empty;
}));
}
else
{
textBox1.Text = string.Empty;
}
}
}
#endregion #region WebSocketServer 事件
private void server_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value)
{
try
{
Log("WebSocket客户端关闭 SessionID=" + session.SessionID);
WebSocketSession temp;
_sessionList.TryRemove(session.SessionID, out temp);
}
catch (Exception ex)
{
Log("server_SessionClosed 错误" + ex.Message);
}
} private void server_NewMessageReceived(WebSocketSession session, string value)
{
try
{
int maxLength = 30;
if (value.Length > maxLength) value = value.Substring(0, maxLength);
Log("WebSocket收到客户端消息 SessionID=" + session.SessionID + " value=" + value);
}
catch (Exception ex)
{
Log("server_NewMessageReceived 错误" + ex.Message);
}
} private void server_NewSessionConnected(WebSocketSession session)
{
try
{
Log("WebSocket客户端连接 SessionID=" + session.SessionID);
_sessionList.TryAdd(session.SessionID, session);
}
catch (Exception ex)
{
Log("server_NewSessionConnected 错误" + ex.Message);
}
}
#endregion //启动
private void button1_Click(object sender, EventArgs e)
{
SocketData data = new SocketData();
data.type = 1;
data.speed = _currentSpeed;
Log("启动 speed=" + _currentSpeed.ToString("0")); Broadcast(data);
} //停止
private void button2_Click(object sender, EventArgs e)
{
Log("停止");
SocketData data = new SocketData();
data.type = 2; Broadcast(data);
} //位置1
private void button3_Click(object sender, EventArgs e)
{
SocketData data = new SocketData();
data.direction = 0;
data.index = 0;
data.type = 3;
data.speed = _currentSpeed;
data.startDeltaX = 20;
data.startDeltaZ = 0;
Log("位置2 direction=" + data.direction + " index=" + data.index + " speed=" + _currentSpeed.ToString("0")); Broadcast(data);
} //位置2
private void button4_Click(object sender, EventArgs e)
{
SocketData data = new SocketData();
data.direction = 1;
data.index = 38;
data.type = 3;
data.speed = _currentSpeed;
data.startDeltaX = 40;
data.startDeltaZ = 0;
Log("位置2 direction=" + data.direction + " index=" + data.index + " speed=" + _currentSpeed.ToString("0")); Broadcast(data);
} //清空日志
private void button5_Click(object sender, EventArgs e)
{
ClearLog();
} //加速
private void button6_Click(object sender, EventArgs e)
{
Task.Run(() =>
{
_currentSpeed *= 1.3;
if (_currentSpeed > 3000) _currentSpeed = 3000;
Log("加速 speed=" + _currentSpeed.ToString("0")); SocketData data = new SocketData();
data.type = 2; Broadcast(data); Thread.Sleep(10); data = new SocketData();
data.type = 1;
data.speed = _currentSpeed; Broadcast(data);
});
} //减速
private void button7_Click(object sender, EventArgs e)
{
Task.Run(() =>
{
_currentSpeed *= 0.7;
if (_currentSpeed < 10) _currentSpeed = 10;
Log("减速 speed=" + _currentSpeed.ToString("0")); SocketData data = new SocketData();
data.type = 2; Broadcast(data); Thread.Sleep(10); data = new SocketData();
data.type = 1;
data.speed = _currentSpeed; Broadcast(data);
});
} private void Broadcast(SocketData data)
{
_server.Broadcast(_sessionList.Values.ToList(), JsonConvert.SerializeObject(data), null);
}
}
}

JavaScript WebSocket 前端代码:

实现了断线重连

startWebSocket() {
let websocket = new WebSocket(websocket_address);
websocket.onopen = e => {
console.log('WebSocket Open');
};
websocket.onclose = e => {
setTimeout(() => {
this.startWebSocket();
}, 5000);
console.log('WebSocket Close');
};
websocket.onmessage = e => {
console.log('WebSocket Message ' + e.data);
let data = eval('(' + e.data + ')');
if (data.type == 1) {
this.continue(data.speed);
} else if (data.type == 2) {
this.suspend();
}
else if (data.type == 3) {
this.stop();
this.startDeltaX = data.startDeltaX;
this.startDeltaZ = data.startDeltaZ;
this.start(data.index, data.direction, data.speed);
}
};
websocket.onerror = e => {
websocket.onclose = function () { }
websocket.close();
setTimeout(() => {
this.startWebSocket();
}, 5000);
console.error(e);
};
}

如何正确关闭WebSocket:

websocket.onerror = e => {
websocket.onclose = function () { }
websocket.close();
setTimeout(() => {
this.startWebSocket();
}, 5000);
console.error(e);
};

JavaScript WebSocket C# SuperSocket.WebSocket 示例的更多相关文章

  1. SuperSocket.WebSocket.WebSocketServer.Setup无法启动

    新学一词:达克效应.引出一句:"无知要比知识更容易产生自信."-- 查尔斯·达尔文 写在前面 在三亚呆了半个月了,三亚的冬天好热啊,让我回忆起了放暑假时下午百无聊赖的时光 { 一睡 ...

  2. WebSocket简单介绍(WebSocket JavaScript 接口)(2)

    上一节介绍了 WebSocket 规范,其中主要介绍了 WebSocket 的握手协议.握手协议通常是我们在构建 WebSocket 服务器端的实现和提供浏览器的WebSocket 支持时需要考虑的问 ...

  3. sprint boot websocket 服务端+html5 示例测试

    包依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...

  4. 火币网API文档——Websocket 请求与订阅示例

    1. 访问地址 Pro 站行情请求地址为:wss://api.huobipro.com/ws HADAX 站行情请求地址为:wss://api.hadax.com/ws 2. 数据压缩 WebSock ...

  5. 一步一步学WebSocket (一) 初识WebSocket

    众所周知,Http协议是无状态的,并且是基于Request/Response的方式与服务器进行交互,也就是我们常说的单工模式.但是随着互联网的发展,浏览器与服务端进行双向通信需求的增加,长轮询向服务器 ...

  6. websocket之一:websocket简介

    Websocket websocket为一次HTTP握手后,后续通讯为tcp协议的通讯方式. WebSocket 使用一种被称作“Upgrade handshake(升级握手)”的机制将标准的 HTT ...

  7. WebSocket 介绍(二)-WebSocket API

    这一章介绍如何用WebSocket API来控制协议和创建应用,运用http://websocket.org 提供的现有WebSocket服务器,我们可以收发消息.创建一些简单的WebSocket应用 ...

  8. 学习WebSocket(一):Spring WebSocket的简单使用

    1.什么是websocket? WebSocket协议定义了一种web应用的新功能,它实现了服务器端和客户端的全双工通信.全双工通信即通信的双方可以同时发送和接收信息 的信息交互方式.它是继Java ...

  9. websocket之四:WebSocket 的鉴权授权方案

    引子 WebSocket 是个好东西,为我们提供了便捷且实时的通讯能力.然而,对于 WebSocket 客户端的鉴权,协议的 RFC 是这么说的: This protocol doesn’t pres ...

  10. WebSocket简单介绍(WebSocket 实战)(3)

    这一节里我们用一个案例来演示怎么使用 WebSocket 构建一个实时的 Web 应用.这是一个简单的实时多人聊天系统,包括客户端和服务端的实现.客户端通过浏览器向聊天服务器发起请求,服务器端解析客户 ...

随机推荐

  1. Educational Codeforces Round 125 (Rated for Div. 2) E. Star MST

    折磨了我三天的\(DP\),终于看懂啦. 首先,如果想要有题目要求的效果,那么最短的边一定都是与\(1\)相连的,就是一个菊花图,生成树里的边就是最短的边. \(f[i][j]\)表示已经有\(i\) ...

  2. 宏(define)与常量(const)

    既然选择了远方,便只顾风雨兼程. 宏(define) 一. 宏的理解   宏是一种批量处理的称谓.一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则 ...

  3. Net 高级调试之十一:托管堆布局架构和对象分配机制

    一.简介 今天是<Net 高级调试>的第十一篇文章,这篇文章来的有点晚,因为,最近比较忙,就没时间写文章了.现在终于有点时间,继续开始我们这个系列.这篇文章我们主要介绍托管堆的架构,对象的 ...

  4. 如何用BI制作图表组合?

    BI(Business Intelligence)是一种通过收集.分析和可视化数据来帮助企业做出决策的技术和工具.在BI中,制作图表组合是一种常见的方式,可以将不同的图表类型组合在一起,以更全面地呈现 ...

  5. Windows 项目的 CMakeLists 编写

    前言: 项目一直是以 .sln 解决方案打开和处理的,上传到 github 也是需要将 sln 文件包括到项目里,不太优雅(虽然方便),毕竟现在开源项目基本都是使用 CMake 做跨平台编译 因为项目 ...

  6. WPF 绑定binding都有哪些事件

    在WPF中,源属性(Source Property)指的是提供数据的属性,通常是数据模型或者其他控件的属性,而目标属性(Target Property)则是数据绑定的目标,通常是绑定到控件的属性,例如 ...

  7. MySQL笔记01: MySQL入门_1.1 MySQL概述

    1.1 MySQL概述 MySQL是一个关系数据库管理系统(Relational DataBase Management System,RDBMS).它是一个程序,可以存储大量的种类繁多的数据,并且提 ...

  8. StarBlog - 2023年底更新内容一览

    前言 先说一下我对 StarBlog 这个系列的文章的规划吧,在 StarBlog 的 1.x 版本,我会同步更新两个系列的文章 博客前台+接口开发笔记 (即当前已发布的这一系列文章) 博客Vue后台 ...

  9. 聊一聊 C# 线程切换后上下文都去了哪里

    一:背景 1. 讲故事 总会有一些朋友是不是问一个问题,在 Windows 中线程做了上下文切换,请问被切的线程他的寄存器上下文都去了哪里?能不能给我挖出来?这个问题其实比较底层,如果对操作系统没有个 ...

  10. Postgres服务器操作方法

    切换用户 sudo su postgres psql postgres 查询当前postgres下的DB列表 \l 查看postgres下角色的详细信息(权限) \du 删除odoo角色 drop r ...