JavaScript WebSocket C# SuperSocket.WebSocket 示例
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 示例的更多相关文章
- SuperSocket.WebSocket.WebSocketServer.Setup无法启动
新学一词:达克效应.引出一句:"无知要比知识更容易产生自信."-- 查尔斯·达尔文 写在前面 在三亚呆了半个月了,三亚的冬天好热啊,让我回忆起了放暑假时下午百无聊赖的时光 { 一睡 ...
- WebSocket简单介绍(WebSocket JavaScript 接口)(2)
上一节介绍了 WebSocket 规范,其中主要介绍了 WebSocket 的握手协议.握手协议通常是我们在构建 WebSocket 服务器端的实现和提供浏览器的WebSocket 支持时需要考虑的问 ...
- sprint boot websocket 服务端+html5 示例测试
包依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...
- 火币网API文档——Websocket 请求与订阅示例
1. 访问地址 Pro 站行情请求地址为:wss://api.huobipro.com/ws HADAX 站行情请求地址为:wss://api.hadax.com/ws 2. 数据压缩 WebSock ...
- 一步一步学WebSocket (一) 初识WebSocket
众所周知,Http协议是无状态的,并且是基于Request/Response的方式与服务器进行交互,也就是我们常说的单工模式.但是随着互联网的发展,浏览器与服务端进行双向通信需求的增加,长轮询向服务器 ...
- websocket之一:websocket简介
Websocket websocket为一次HTTP握手后,后续通讯为tcp协议的通讯方式. WebSocket 使用一种被称作“Upgrade handshake(升级握手)”的机制将标准的 HTT ...
- WebSocket 介绍(二)-WebSocket API
这一章介绍如何用WebSocket API来控制协议和创建应用,运用http://websocket.org 提供的现有WebSocket服务器,我们可以收发消息.创建一些简单的WebSocket应用 ...
- 学习WebSocket(一):Spring WebSocket的简单使用
1.什么是websocket? WebSocket协议定义了一种web应用的新功能,它实现了服务器端和客户端的全双工通信.全双工通信即通信的双方可以同时发送和接收信息 的信息交互方式.它是继Java ...
- websocket之四:WebSocket 的鉴权授权方案
引子 WebSocket 是个好东西,为我们提供了便捷且实时的通讯能力.然而,对于 WebSocket 客户端的鉴权,协议的 RFC 是这么说的: This protocol doesn’t pres ...
- WebSocket简单介绍(WebSocket 实战)(3)
这一节里我们用一个案例来演示怎么使用 WebSocket 构建一个实时的 Web 应用.这是一个简单的实时多人聊天系统,包括客户端和服务端的实现.客户端通过浏览器向聊天服务器发起请求,服务器端解析客户 ...
随机推荐
- 28. 干货系列从零用Rust编写正反向代理,项目日志的源码实现
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现 ...
- 算法训练 递归 s01串
问题描述 s01串初始为"0" 按以下方式变换 0变1,1变01 输入格式 1个整数(0~19) 输出格式 n次变换后s01串 样例输入 3 样例输出 101 数据规模和约定 0~ ...
- 基于OpenAi通用特定领域的智能语音小助手
无穷尽的Q&A 钉钉...钉钉... 双双同学刚到工位,报销答疑群的消息就万马纷沓而来.她只能咧嘴无奈的摇摇头.水都还没有喝一口就开始"人工智能"的去回复.原本很阳光心情开 ...
- 数据库是mysql,使用DBeaver的SQL编辑器执行sql脚本文件时,报错:No active connection 。
遇到这种问题,多半是因为没有与数据库关联 具体操作点击右键,选择与数据库关联 结果如下 出现这个就好了.
- springboot下添加日志模块和设置日志文件输出
前言 日志的使用将通过SLF4J来使用,SLF4J(Simple Logging Facade for Java)是一个为Java应用提供简单日志记录的接口.它的主要目标是在不同的日志系统之间提供一个 ...
- [GDOI22pj2C] 教室的电子钟
第三题 教室的电子钟 提交文件: clock.cpp 输入文件: clock.in 输出文件: clock.out 时间空间限制: 1 秒, 256 MB 为了迎接 GDOI,小蒟蒻学校所有教室的钟都 ...
- C++ Qt开发:StatusBar底部状态栏组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QStatus ...
- C++ Qt开发:Charts绘图组件概述
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QCharts ...
- 关于SpringBoot中出现的循环依赖问题
环境: SpringBoot2.7.8 背景: 在增加出库订单时需要对物品表的的数量进行修改 因此我在OutboundController中创建了几个公共方法,并将其注入到Spring中,结果给我报了 ...
- Android动态数字输入框
基础view如下: 具体的思路实现: 1:展示textview实现 2: 顶层使用透明的edittext.获取焦点/删除文字等. public class BaseVerificationCodeVi ...