資源簡介
本項目是用C#控制臺程序實現服務,非服務器實現,非服務器實現,非服務器實現
TestWebSocket - 服務器程序
TestWebSocket_Client - 客戶端控制臺程序
Index.html - 客戶端H5頁面(直接雙擊打開即可)
博文https://blog.csdn.net/u012949563/article/details/102873181
代碼片段和文件信息
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Net;
using?System.Net.WebSockets;
using?System.Text;
using?System.Threading.Tasks;
namespace?TestWebSocket
{
????class?Program
????{
????????///?
????????///?HTTP監聽服務
????????///?
????????private?static?HttpListener?listener;
????????///?
????????///?接收數組
????????///?
????????private?static?ArraySegment?reciveBufs?=?new?ArraySegment(new?byte[0xFFFF]);
????????///?
????????///?ws連接管理
????????///?
????????private?static?List?clients?=?new?List();
????????///?
????????///?中途取消
????????///?
????????private?static?System.Threading.CancellationToken?cancel;
????????static?void?Main(string[]?args)
????????{
????????????var?cancelSource?=?new?System.Threading.CancellationTokenSource();??//初始化中途取消實例?(可能通過這個中途取消WS)
????????????cancel?=?cancelSource.Token;
????????????listener?=?new?HttpListener();??????//打開HTTP服務
????????????listener.Prefixes.Add(“http://127.0.0.1:8080/“);??//HTTP服務網址
????????????listener.Start();???//開始監聽HTTP
????????????listener.BeginGetContext(Service?listener);????//異步接收
????????????Console.WriteLine(“WebSocket?service?start!“);
????????????while?(true)?//循環接收用戶輸入防止程序結束
????????????{
????????????????var?str?=?Console.ReadLine();???//讀取一行輸入
????????????}
????????}
????????///?
????????///?異步接收(未做出錯處理(try?catch))
????????///?
????????///?
????????private?static?void?Service(IAsyncResult?ar)
????????{
????????????var?context?=?listener.EndGetContext(ar);???//讀取
????????????new?Task(()?=>?ProContext(context)).Start();????//新進程處理
????????????listener.BeginGetContext(Service?listener);????//繼續異步接收
????????}
????????///?
????????///?處理ws連接
????????///?
????????///?
????????private?static?async?void?ProContext(HttpListenerContext?context)
????????{
????????????var?wsContext?=?await?context.AcceptWebSocketAsync(null);???//獲取上下文
????????????Console.WriteLine($“{DateTime.Now}?-?{context.Request.RemoteEndPoint}?-?WebSocket?conected!“);??//顯示有WS連接?(WS來者不據可在此通過IP等篩選連接)
????????????using?(var?ws?=?wsContext.WebSocket)????//使用using保證WS得到釋放
????????????{
????????????????clients.Add(ws);????//管理WS連接?
????????????????WebSocketReceiveResult?wsdata;?//接收結果變量
????????????????while?(true)
????????????????{
????????????????????try
????????????????????{
????????????????????????wsdata?=?await?ws.ReceiveAsync(reciveBufs?cancel);?//接收數據
????????????????????}
????????????????????catch?{//接收失敗退出連接
????????????????????????Console.WriteLine($“{DateTime.Now}?-?{context.Request.RemoteEndPoint}?-?out!“);
????????????????????????clients.Remove(ws);?//管理ws連接
????????????????????????break;
????????????????????}
????????????????????byte[]?bRec?=?new?byte[wsdata.Count];???//接收數組
????????????????????Array.Copy(recive
評論
共有 條評論