123123123213

This commit is contained in:
2025-12-11 10:01:36 +08:00
commit 21d4bf8161
160 changed files with 4594 additions and 0 deletions

213
‌WebSocketServer.cs Normal file
View File

@ -0,0 +1,213 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Windows.Forms;
using System.Xml;
using Fleck;
using Microsoft.VisualBasic.ApplicationServices;
using Newtonsoft.Json;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
public class WebSocketServer
{
//用户信息
public static List<ClassUserInfo> IWebSocketUserinfo = new List<ClassUserInfo>();
//socket信息
public static List<IWebSocketConnection> _clients = new List<IWebSocketConnection>();
//课程信息
public static List<ClassInfo> _classInfos = new List<ClassInfo>();
public Fleck.WebSocketServer _server;
public async void Start(string location)
{
var certPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "fullchain.pfx");
if (!File.Exists(certPath))
{
MessageBox.Show("证书文件未找到!");
return;
}
var certificate = new X509Certificate2(certPath, "");
var _server = new Fleck.WebSocketServer(location)
{
Certificate = certificate,
EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12,
RestartAfterListenError = true
};
_server.Start(async socket =>
{
socket.OnOpen = () =>
{
try
{
Result r = new Result();
ClassUserInfo u = new ClassUserInfo();
var query = HttpUtility.ParseQueryString(socket.ConnectionInfo.Path);
u.UserName = HttpUtility.UrlDecode(query["UserName"]);
u.Class = Convert.ToInt64(query["Class"]);
u.Schoolclass = Convert.ToInt32(query["SchoolClass"]);
u.UserID = Convert.ToInt64(query["UserID"]);
u.UserType = Convert.ToInt32(query["UserType"]);//0学生 1老师 2教室
u.GUID = socket.ConnectionInfo.Id;
string token = query["Token"];
u.Linsocket = socket;
if (token != "123456")
{
r.IsSuccess = false;
r.Data = "Faile TokenNo";
r.MessageType = 0;
socket.Send(JsonConvert.SerializeObject(r));
return;
}
else
{
IWebSocketUserinfo.Add(u);
}
}
catch { }
};
socket.OnClose = () =>
{
try
{
IWebSocketUserinfo.RemoveAll(P => P.GUID == socket.ConnectionInfo.Id);
_clients.Remove(socket);
}
catch { }
};
socket.OnMessage = message =>
{
try
{
var user = IWebSocketUserinfo.First(p => p.GUID == socket.ConnectionInfo.Id);
OperaterSocketData(message, IWebSocketUserinfo, socket, user);
}
catch {
}
};
});
}
//消息处理
public async void OperaterSocketData(string message, List<ClassUserInfo> ListUser, IWebSocketConnection socket, ClassUserInfo user)
{
try
{
ReciveSocketInfo recive = JsonConvert.DeserializeObject<ReciveSocketInfo>(message);
// 群发
if (recive.Type == 1)
{
SendDataOtherUser(recive, ListUser, user);
}
//单发
if (recive.Type == 0)
{
SendDataUserToUser(recive, ListUser, user);
}
}
catch {
}
}
//如果是发单人
public async void SendDataOtherUser(ReciveSocketInfo recive, List<ClassUserInfo> ListUser, ClassUserInfo user)
{
string userIDList = recive.UserIDS;
if (!string.IsNullOrEmpty(userIDList))
{
string[] userids = userIDList.Trim().Split(',');
foreach (ClassUserInfo c in ListUser)
{
foreach (string userID in userids)
{
if (c.UserID == Convert.ToInt64(userID)&&c.UserType == recive.UserType)
{
c.Linsocket.Send(recive.Data);
}
}
}
}
string rclass = recive.Class;
if (!string.IsNullOrEmpty(rclass))
{
string[] rclasslist = rclass.Trim().Split(',');
foreach (ClassUserInfo c in ListUser)
{
foreach (string r in rclasslist)
{
if (c.Class == Convert.ToInt64(r) && c.UserType == recive.UserType)
{
c.Linsocket.Send(recive.Data);
}
}
}
}
string rschoolclass = recive.SchoolClass;
if (!string.IsNullOrEmpty(rschoolclass))
{
string[] rschoolclasslist = rschoolclass.Trim().Split(',');
foreach (ClassUserInfo c in ListUser)
{
foreach (string r in rschoolclasslist)
{
if (c.Schoolclass == Convert.ToInt64(r) && c.UserType == recive.UserType)
{
c.Linsocket.Send(recive.Data);
}
}
}
}
}
private async void SendDataUserToUser(ReciveSocketInfo recive, List<ClassUserInfo> ListUser, ClassUserInfo user)
{
foreach (ClassUserInfo c in ListUser)
{
if (c.UserID == recive.UserID && c.UserType == recive.UserType)
{
c.Linsocket.Send(recive.Data);
}
}
}
public void Stop()
{
foreach (var client in _clients.ToList())
{
client.Close();
}
_clients.Clear();
// Console.WriteLine("WebSocket 服务器已停止");
}
}