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 应用.这是一个简单的实时多人聊天系统,包括客户端和服务端的实现.客户端通过浏览器向聊天服务器发起请求,服务器端解析客户 ...
随机推荐
- 递归与分治思想:n的阶乘 && 逆序任意长度字符串(递归)
1 //n的阶乘 2 #include<stdio.h> 3 4 int fun(int n); 5 int main(void) 6 { 7 int n; 8 scanf("% ...
- 手把手教你搭建 Ceph+JuiceFS
Ceph 提供了对象存储,可作为存储引擎在 JuiceFS 中使用.这一组合非常适合云计算.大数据分析和机器学习等数据密集型应用场景. 在日常部署中可直接通过 Ceph RADOS 配合 JuiceF ...
- controller加载控制与业务bean加载控制
1.因功能的不同,如何避免Spring错误加载到SpringMVC的bean--加载Spring控制的bean的时候排除掉SpringMVC控制的bean. package com.itheima.c ...
- Python 潮流周刊第一季完结(1~30)
你好,我是猫哥.庆祝 Python 潮流周刊在几天前顺利更新到了第 30 期! 我觉得这是一个很有意义的时间节点,不太短也不漫长,很适合作一个小小的总结. 我打算今后每 30 期作为一季,都给大家做一 ...
- ubuntu 22.04搭建本地源
ubuntu 22.04搭建本地源 基于服务器无法联网的情况下,从一台可以上网的服务器下载软件包和依赖,再在无法联网的服务器中搭建本地源,安装环境. 下载(包括依赖): cd /root mkdir ...
- Java并发(二十)----synchronized原理进阶
1.小故事 故事角色 老王 - JVM 小南 - 线程 小女 - 线程 房间 - 对象 房间门上 - 防盗锁 - Monitor-重量级锁 房间门上 - 小南书包 - 轻量级锁 房间门上 - 刻上小南 ...
- 华企盾DSC客户端右键菜单不显示常见处理方法
1.检查控制台"客户端不显示右键菜单项" 2.未分发模块权限,若以分配可尝试去掉重新分配模块 3.检查杀毒软件是否杀掉了5097目录的文件(覆盖安装,以上两条没问题,这条比较常见) ...
- libgdx摄像头的移动
要知道,做一个游戏,摄像头是必不可少的.接下来,我将讲解libgdx里面摄像头的移动 2d摄像头OrthographicCamera也叫做正交相机 结果展示: 按上下左右是可以移动的 Orthogra ...
- Codeforce Round 916(div3)
Codeforces Round 916(div3) [Problem - A - Codeforces]:Problemsolving Log A.题 直接看样例进行分析,发现每一次出现的字符代表着 ...
- JavaFx之ScrollPane滚动板面、CheckBox复选框(二十四)
JavaFx之ScrollPane滚动板面.CheckBox复选框(二十四) 多个复选框时可能会超出屏幕,需要使用滚动版面. 布局方式:ScrollPane包括VBox.VBox 包括多个 Check ...