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. go基础-函数

    概述 在任何语言中函数都是极其重要的内容,业务功能都是由一个或多个函数组合完成.go语言是函数式编程语言,函数是一等公民,可以被传递.有函数类型,go语言有三种类型的函数,普通函数.匿名函数(Lamb ...

  2. Acwing4244牛的比赛

    Acwing4244.牛的比赛 题目部分 N 头奶牛,编号 1∼N,一起参加比赛. 奶牛的战斗力两两不同. 这些奶牛之间已经进行了 M轮两两对决. 在对决中,战斗力高的奶牛一定会战胜战斗力低的奶牛. ...

  3. .net 下优秀的DI框架推荐,看看你用过几个?

    在.NET生态系统中,有许多出色的依赖注入(DI)框架可供选择.每个框架都有其独特的特点和优点,可以根据项目需求和偏好进行选择.下面详细介绍一些.NET中优秀的DI框架,它们的优点以及适用场景. 1. ...

  4. [USACO2007OPENS] Fliptile S

    题目描述 FJ 知道,智商高的奶牛产奶量也大,所以他为奶牛们准备了一个翻动瓦片的益智游戏. 在一个 \(M \times N\) 的方阵上(\(1 \leq M,N \leq 15\)),每个格子都有 ...

  5. 数据仓库——Hive

    数据仓库:是一个用于储存,分析,报告的数据系统 数据仓库的目的是构建面向分析的集成化数据环境,分析结果为企业提供决策支持 数仓专注分析 数据仓库仓库为何而来,解决什么问题的? 为了分析数据而来,分析结 ...

  6. SpringBoot使用maven打jar包配置

    在pom.xml文件中加入依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactI ...

  7. 微服务项目-小Q视频网

    1.后台管理系统(更新中...) (1)讲师列表 (2)添加讲师 (3)导入课程分类 (4)课程分类列表 其他功能就不一一截图了,后台详细功能如下 2.前台会员系统(更新中...) (1)前台的技术栈 ...

  8. Oracle-Rman备份全解析

    RMAN备份数据库物理文件到备份集(backupset)中.在创建备份集时,仅备份已经使用的数据库(不备份空闲的数据块),而且还可以采用压缩功能. RMAN恢复时指当数据库出现介质失败时,使用RMAN ...

  9. 华企盾DSC客户端连不上服务器(客户端在回收站)

    解决方法:确保该计算机在CLIENT表recyclebin列中的值为False,最好把所有计算机都改成False,改好后重启DSC服务器,最后重新安装客户端. 或者将客户端从回收站移动到正常的工作组.

  10. 多维数组、Arrays类、稀疏数组、冒泡排序

    多维数组 多维数组可以看成是数组的数组 比如二维数组就是一个特殊的一堆数组 其中每个元素就是一个数组. 二维数组: int a[][] = new int[2][5]; 解析:二维数组a可以看成一个两 ...