实例介绍
【实例简介】WEBSOCKET 在线实时聊天,基本代码引用网上教程,添加了离线消息和私聊功能
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; using System.Collections; namespace WebSocketServer { public class Logger { public bool LogEvents { get; set; } public Logger() { LogEvents = true; } public void Log(string Text) { if (LogEvents) Console.WriteLine(Text); } } public enum ServerStatusLevel { Off, WaitingConnection, ConnectionEstablished }; public delegate void NewConnectionEventHandler(string loginName,EventArgs e); public delegate void DataReceivedEventHandler(Object sender, string message, EventArgs e); public delegate void DisconnectedEventHandler(Object sender,EventArgs e); public delegate void BroadcastEventHandler(string message, EventArgs e); public class WebSocketServer : IDisposable { private bool AlreadyDisposed; private Socket Listener; private int ConnectionsQueueLength; private int MaxBufferSize; private string Handshake; private StreamReader ConnectionReader; private StreamWriter ConnectionWriter; private Logger logger; private byte[] FirstByte; private byte[] LastByte; private byte[] ServerKey1; private byte[] ServerKey2; List<SocketConnection> connectionSocketList = new List<SocketConnection>(); public ServerStatusLevel Status { get; private set; } public int ServerPort { get; set; } public string ServerLocation { get; set; } public string ConnectionOrigin { get; set; } public bool LogEvents { get { return logger.LogEvents; } set { logger.LogEvents = value; } } public event NewConnectionEventHandler NewConnection; public event DataReceivedEventHandler DataReceived; public event DisconnectedEventHandler Disconnected; public string OfflineUser = ""; public string OfflineMessage = ""; private void Initialize() { AlreadyDisposed = false; logger = new Logger(); Status = ServerStatusLevel.Off; //连接数量 ConnectionsQueueLength = 500; //最大缓存 MaxBufferSize = 1024 * 100; FirstByte = new byte[MaxBufferSize]; LastByte = new byte[MaxBufferSize]; FirstByte[0] = 0x00; LastByte[0] = 0xFF; logger.LogEvents = true; } public WebSocketServer() { ServerPort = 4141; ServerLocation = string.Format("ws://{0}:4141/chat", getLocalmachineIPAddress()); Initialize(); } public WebSocketServer(int serverPort, string serverLocation, string connectionOrigin) { ServerPort = serverPort; ConnectionOrigin = connectionOrigin; ServerLocation = serverLocation; Initialize(); } ~WebSocketServer() { Close(); } public void Dispose() { Close(); } private void Close() { if (!AlreadyDisposed) { AlreadyDisposed = true; if (Listener != null) Listener.Close(); foreach (SocketConnection item in connectionSocketList) { item.ConnectionSocket.Close(); } connectionSocketList.Clear(); GC.SuppressFinalize(this); } } public static IPAddress getLocalmachineIPAddress() { string strHostName = Dns.GetHostName(); IPHostEntry ipEntry = Dns.GetHostEntry(strHostName); foreach (IPAddress ip in ipEntry.AddressList) { //IPV4 if (ip.AddressFamily == AddressFamily.InterNetwork) return ip; } return ipEntry.AddressList[0]; } public void StartServer() { Char char1 = Convert.ToChar(65533); Listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); Listener.Bind(new IPEndPoint(getLocalmachineIPAddress(), ServerPort)); Listener.Listen(ConnectionsQueueLength); logger.Log(string.Format("聊天服务器启动。监听地址:{0}, 端口:{1}",getLocalmachineIPAddress(),ServerPort)); logger.Log(string.Format("WebSocket服务器地址: ws://{0}:{1}/chat", getLocalmachineIPAddress(), ServerPort)); while (true) { Socket sc = Listener.Accept(); if (sc != null) { System.Threading.Thread.Sleep(100); SocketConnection socketConn = new SocketConnection(); socketConn.ConnectionSocket = sc; socketConn.NewConnection = new NewConnectionEventHandler(socketConn_NewConnection); socketConn.DataReceived = new DataReceivedEventHandler(socketConn_BroadcastMessage); socketConn.Disconnected = new DisconnectedEventHandler(socketConn_Disconnected); socketConn.ConnectionSocket.BeginReceive(socketConn.receivedDataBuffer, 0, socketConn.receivedDataBuffer.Length, 0, new AsyncCallback(socketConn.ManageHandshake), socketConn.ConnectionSocket.Available); connectionSocketList.Add(socketConn); } } } void socketConn_Disconnected(Object sender, EventArgs e) { SocketConnection sConn = sender as SocketConnection; if (sConn != null) { Send(string.Format("【{0}】离开了聊天室!", sConn.Name)); sConn.ConnectionSocket.Close(); //移除队列 connectionSocketList.Remove(sConn); //添加离线成员 OfflineUser = sConn.Name ","; } } void socketConn_BroadcastMessage(Object sender, string message, EventArgs e) { if (message.IndexOf("login:") != -1) { SocketConnection sConn = sender as SocketConnection; sConn.Name = message.Substring(message.IndexOf("login:") "login:".Length); message = string.Format("欢迎【{0}】来到聊天室!",message.Substring(message.IndexOf("login:") "login:".Length)); } if (message.IndexOf("User:") != -1 && message.IndexOf("Content:") != -1) { SocketConnection sConn = sender as SocketConnection; string user = message.Substring(message.IndexOf("User:") "User:".Length, message.IndexOf("Content:") - message.IndexOf("User:") - "User:".Length); string mes = message.Substring(message.IndexOf("Content:") "Content:".Length); Send(user, mes); return; } Send(message); } void socketConn_NewConnection(string name, EventArgs e) { if (NewConnection != null) NewConnection(name,EventArgs.Empty); } public void Send(string name, string message) { foreach (SocketConnection item in connectionSocketList) { if (!item.ConnectionSocket.Connected) { return; } if (OfflineUser.Contains(name)) { OfflineMessage = message; } if (name == item.Name) { try { if (item.IsDataMasked) { DataFrame dr = new DataFrame(message); item.ConnectionSocket.Send(dr.GetBytes()); } else { item.ConnectionSocket.Send(FirstByte); item.ConnectionSocket.Send(Encoding.UTF8.GetBytes(message)); item.ConnectionSocket.Send(LastByte); } } catch (Exception ex) { logger.Log(ex.Message); } } } } public void Send(string message) { if (OfflineUser != "") { OfflineMessage = "离线消息" message "\n"; } foreach (SocketConnection item in connectionSocketList) { if (!item.ConnectionSocket.Connected) { return; } if (OfflineUser.Contains(item.Name)) { message = OfflineMessage; OfflineUser = ""; OfflineMessage = ""; } try { if (item.IsDataMasked) { DataFrame dr = new DataFrame(message); item.ConnectionSocket.Send(dr.GetBytes()); } else { item.ConnectionSocket.Send(FirstByte); item.ConnectionSocket.Send(Encoding.UTF8.GetBytes(message)); item.ConnectionSocket.Send(LastByte); } } catch (Exception ex) { logger.Log(ex.Message); } } } } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论