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 应用.这是一个简单的实时多人聊天系统,包括客户端和服务端的实现.客户端通过浏览器向聊天服务器发起请求,服务器端解析客户 ...
随机推荐
- Android学习day02【页面布局的练习】
在网上找了一些图片,只用最简单的颜色进行区分,目的是熟悉线性布局和相对布局 下面是我找到的简单的Android页面,你也可以尝试以下' 下面是我的实现代码 第一个
- Codeforces Round 905 (Div. 3)
Codeforces Round 905 (Div. 3) A. Morning 题意:操作:显示,向前走都为一次操作:目标:显示这四个数 思路:0->10,然后依次作差就行 #include ...
- httpclients 和 okhttp 区别
HttpClient使用介绍使用HttpClient发送请求主要分为以下几步骤: 创建 CloseableHttpClient对象或CloseableHttpAsyncClient对象,前者同步,后者 ...
- java文件读取 while ((len = reader.read(buffer)) != -1){}的理解
源文件 InputStreamReader reader=new InputStreamReader(new FileInputStream(file),"UTF-8"); //读 ...
- 教你使用Prometheus-Operator进行K8s集群监控
本文分享自华为云社区<Promethues-operator入门使用指导>,作者:可以交个朋友. 一. 背景 在非operator配置的普罗中我们监控k8s集群都是通过配置configma ...
- 单元测试框架pytest
1.什么是pytest pytest是一个非常成熟的全功能的Python测试框架,主要有以下特点: 简单灵活,容易上手,文档丰富 支持参数化,可以细粒度地控制要测试的测试用例 能够支持简单的单元测试和 ...
- Elasticsearch入门到进阶
Elasticsearch 一.Elasticsearch 是什么(中文官网)? Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本.数字.地理空间.结构化和非结构化数据 ...
- 2024年 为什么不建议新人学习ABAP
引言 每个应届生都希望自己有良好的职业发展,当他们发现前路难通时,便会寻找更好的出路. "转码"曾经是个很火热的话题.在互联网行业高速发展的年代,转行学代码,入职大厂,升职加薪,是 ...
- 如何基于 k8s做私有化部署
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 随着国内数字化转型的加速和国产化进程推动,软件系统的私有化部署已经成为非常热门的话题,因为私有化部署赋予了企业更大的灵活和 ...
- LR(0)分析法
LR(0)是一种自底向上的语法分析方法.两个基本动作是移进和规约. 具体例子如下 已知文法G[E] (1) E→aА (2) E→bB (3) A→cА (4) A→d (5) B→cB (6) B→ ...