WebSocket、服务器推送技能
WebSocket是一种在单个 TCP 连接上进行 全双工 通讯的协议,它可以让客户端和服务器之间进行实时的双向通讯,且不存在同源策略限定
WebSocket 使用一个长连接,在客户端和服务器之间保持长期的连接,从而可以实时地发送和吸取数据。
在 WebSocket 中,客户端和服务器之间可以相互发送消息,客户端可以使用 JavaScript 中的 WebSocket API 发送消息到服务器,也可以吸取服务器发送的消息。
与传统的HTTP通讯相比,WebSocket更轻量级、更高效,适用于须要实时通讯或推送消息的场景。
WebSocket的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息。
》》心跳机制是什么?
心跳机制是每隔一段时间会向服务器发送一个数据包,告诉服务器自己还在世,同时客户端会确认服务器端是否还在世,如果还在世的话,就会回传一个数据包给客户端来确定服务器端也还在世,否则的话,有大概是网络断开连接了。须要重连~
WebSocket与HTTP的区别
websocket和http都是基于TCP的应用层协议,使用的也是 80 端口(若运行在 TLS 之上时,默认使用 443 端口)。
其区别主要就在于连接的性子和通讯方式。
WebSocket是一种双向通讯的协议,通过一次握手即可创建长期性的连接,服务器和客户端可以随时发送和吸取数据。
而HTTP协议是一种请求-相应模式的协议,每次通讯都须要发送一条请求并等待服务器的相应。
WebSocket的实时性更好,耽误更低,并且在服务器和客户端之间提供双向的即时通讯能力,适用于须要实时数据传输的场景。
常见应用场景
实时聊天:WebSocket可以或许提供双向、实时的通讯机制,使得实时聊天应用可以或许快速、高效地发送和吸取消息,实现即时通讯。
实时协作:用于实时协作工具,如协同编辑文档、白板绘画、团队任务管理等,团队成员可以实时地在同一页面上进行互动和实时更新。
实时数据推送:用于实时数据推送场景,如股票行情、新闻快讯、实时天气信息等,服务器可以实时将数据推送给客户端,确保数据的实时性和正确性。
多人在线游戏:实时的双向通讯机制,适用于多人在线游戏应用,使得游戏服务器可以或许实时地将游戏状态和玩家行为传输给客户端,实现游戏的实时互动。
在线客服:WebSocket可以用于在线客服和客户支持系统,实实际时的客户沟通和问题解决,提供更好的用户体验,减少等待时间。
asp.net websocket
https://i-blog.csdnimg.cn/direct/79e16d7758e74432909941db188a8343.png
https://i-blog.csdnimg.cn/direct/42ba1fe7d2cf4393b84fccc7c30a2271.png
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Chat</title>
</head>
<body>
<input type="text" id="messageInput">
<button onclick="sendMessage()">Send</button>
<ul id="messageList"></ul>
<script>
var socket = new WebSocket('ws://localhost:54411/api/zen');
socket.OPEN = () => {
console.log("===");
}
socket.onmessage = function(event) {
var messageList = document.getElementById('messageList');
var li = document.createElement('li');
li.textContent = event.data;
messageList.appendChild(li);
};
function sendMessage() {
var messageInput = document.getElementById('messageInput');
var message = messageInput.value;
socket.send(message);
messageInput.value = '';
}
</script>
</body>
</html>
服务端
https://i-blog.csdnimg.cn/direct/3bc51d267b4e4cfa82ddbee79eeffb11.png
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.WebSockets;
namespace WebApplication1.Controllers
{
public class ZenController : ApiController
{
public HttpResponseMessage Get()
{
if (HttpContext.Current.IsWebSocketRequest)
{
HttpContext.Current.AcceptWebSocketRequest(ProcessWSChat);
}
return new HttpResponseMessage(HttpStatusCode.SwitchingProtocols);
}
private async Task ProcessWSChat(AspNetWebSocketContext arg)
{
WebSocket socket = arg.WebSocket;
while (true)
{
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte);
WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None);
if (socket.State == WebSocketState.Open)
{
string message = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);
string returnMessage = "You send :" + message + ". at" + DateTime.Now.ToLongTimeString();
buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(returnMessage));
await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
}
else
{
break;
}
}
}
}
}
using System;
using System.Collections.Concurrent;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
public class WebSocketManager
{
private readonly ConcurrentDictionary<string, WebSocket> _sockets = new ConcurrentDictionary<string, WebSocket>();
public void AddSocket(string id, WebSocket socket)
{
_sockets.TryAdd(id, socket);
}
public void RemoveSocket(string id)
{
if (_sockets.TryRemove(id, out var socket))
{
socket.Dispose();
}
}
public async Task SendMessageToAllAsync(string message)
{
foreach (var socket in _sockets.Values)
{
await SendMessageAsync(socket, message);
}
}
private async Task SendMessageAsync(WebSocket socket, string message)
{
var buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(message));
try
{
await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
}
catch (Exception)
{
// Handle exception
RemoveSocket(socket.GetHashCode().ToString());
}
}
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]