C#用websocket实现简易聊天功能(服务端)

Emma ·
更新时间:2024-09-20
· 1294 次阅读

C# 利用websocket实现简易聊天功能——服务端,供大家参考,具体内容如下

前言

使用C#语言进行开发,基于.NET FrameWork4

功能包含群聊,和私聊

界面

界面设计代码

namespace chat_server {     partial class Form1     {         /// <summary>         /// 必需的设计器变量。         /// </summary>         private System.ComponentModel.IContainer components = null;         /// <summary>         /// 清理所有正在使用的资源。         /// </summary>         /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>         protected override void Dispose(bool disposing)         {             if (disposing && (components != null))             {                 components.Dispose();             }             base.Dispose(disposing);         }         #region Windows 窗体设计器生成的代码         /// <summary>         /// 设计器支持所需的方法 - 不要修改         /// 使用代码编辑器修改此方法的内容。         /// </summary>         private void InitializeComponent()         {             this.textBoxIP = new System.Windows.Forms.TextBox();             this.labelIP = new System.Windows.Forms.Label();             this.labelPort = new System.Windows.Forms.Label();             this.textBoxPort = new System.Windows.Forms.TextBox();             this.buttonStart = new System.Windows.Forms.Button();             this.textBoxLog = new System.Windows.Forms.TextBox();             this.textBoxMsg = new System.Windows.Forms.TextBox();             this.buttonSend = new System.Windows.Forms.Button();             this.SuspendLayout();             //              // textBoxIP             //              this.textBoxIP.Location = new System.Drawing.Point(145, 25);             this.textBoxIP.Name = "textBoxIP";             this.textBoxIP.Size = new System.Drawing.Size(100, 25);             this.textBoxIP.TabIndex = 0;             this.textBoxIP.Text = "127.0.0.1";             //              // labelIP             //              this.labelIP.AutoSize = true;             this.labelIP.Location = new System.Drawing.Point(90, 28);             this.labelIP.Name = "labelIP";             this.labelIP.Size = new System.Drawing.Size(31, 15);             this.labelIP.TabIndex = 1;             this.labelIP.Text = "IP:";             //              // labelPort             //              this.labelPort.AutoSize = true;             this.labelPort.Location = new System.Drawing.Point(371, 28);             this.labelPort.Name = "labelPort";             this.labelPort.Size = new System.Drawing.Size(54, 15);             this.labelPort.TabIndex = 3;             this.labelPort.Text = "port:";             //              // textBoxPort             //              this.textBoxPort.Location = new System.Drawing.Point(452, 25);             this.textBoxPort.Name = "textBoxPort";             this.textBoxPort.Size = new System.Drawing.Size(100, 25);             this.textBoxPort.TabIndex = 2;             this.textBoxPort.Text = "6666";             //              // buttonStart             //              this.buttonStart.Location = new System.Drawing.Point(718, 13);             this.buttonStart.Name = "buttonStart";             this.buttonStart.Size = new System.Drawing.Size(142, 45);             this.buttonStart.TabIndex = 4;             this.buttonStart.Text = "开启服务";             this.buttonStart.UseVisualStyleBackColor = true;             this.buttonStart.Click += new System.EventHandler(this.buttonStart_Click);             //              // textBoxLog             //              this.textBoxLog.Location = new System.Drawing.Point(28, 73);             this.textBoxLog.Multiline = true;             this.textBoxLog.Name = "textBoxLog";             this.textBoxLog.Size = new System.Drawing.Size(832, 406);             this.textBoxLog.TabIndex = 5;             //              // textBoxMsg             //              this.textBoxMsg.Location = new System.Drawing.Point(28, 499);             this.textBoxMsg.Name = "textBoxMsg";             this.textBoxMsg.Size = new System.Drawing.Size(653, 25);             this.textBoxMsg.TabIndex = 6;             //              // buttonSend             //              this.buttonSend.Location = new System.Drawing.Point(761, 499);             this.buttonSend.Name = "buttonSend";             this.buttonSend.Size = new System.Drawing.Size(99, 43);             this.buttonSend.TabIndex = 7;             this.buttonSend.Text = "发送";             this.buttonSend.UseVisualStyleBackColor = true;             this.buttonSend.Click += new System.EventHandler(this.buttonSend_Click);             //              // Form1             //              this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;             this.ClientSize = new System.Drawing.Size(947, 567);             this.Controls.Add(this.buttonSend);             this.Controls.Add(this.textBoxMsg);             this.Controls.Add(this.textBoxLog);             this.Controls.Add(this.buttonStart);             this.Controls.Add(this.labelPort);             this.Controls.Add(this.textBoxPort);             this.Controls.Add(this.labelIP);             this.Controls.Add(this.textBoxIP);             this.Name = "Form1";             this.Text = "服务器";             this.Load += new System.EventHandler(this.Form1_Load);             this.ResumeLayout(false);             this.PerformLayout();         }         #endregion         private System.Windows.Forms.TextBox textBoxIP;         private System.Windows.Forms.Label labelIP;         private System.Windows.Forms.Label labelPort;         private System.Windows.Forms.TextBox textBoxPort;         private System.Windows.Forms.Button buttonStart;         private System.Windows.Forms.TextBox textBoxLog;         private System.Windows.Forms.TextBox textBoxMsg;         private System.Windows.Forms.Button buttonSend;     } }

源代码

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms; namespace chat_server {     public partial class Form1 : Form     {         public Form1()         {             InitializeComponent();         }         private void Form1_Load(object sender, EventArgs e)         {         }         // socket连接容器         Dictionary<Socket, String> userContain = new Dictionary<Socket, string>();         private void buttonStart_Click(object sender, EventArgs e)         {             try             {                 //1、创建socket                 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                 //2、绑定ip和端口                 String ip = textBoxIP.Text;                 int port = Convert.ToInt32(textBoxPort.Text);                 socket.Bind(new IPEndPoint(IPAddress.Parse(ip), port));                 //3、开启监听                 socket.Listen(10);//等待连接队列的最大值                 //4、开始接受客户端的链接                 ThreadPool.QueueUserWorkItem(new WaitCallback(connect), socket);             }             catch             {                 MessageBox.Show("启动服务器失败");             }         }         private void connect(object socket)         {             var serverSockert = socket as Socket;//强制转换             showLog("服务器正常启动,开始接受客户端的数据");             byte[] data = new byte[1024];             int len;             String name; //客户端的用户名             while (true)             {                 try                 {                     var proxSocket = serverSockert.Accept();//接受连接                     len = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);//接受客户端的用户名                     name = Encoding.Default.GetString(data, 0, len);                     showLog(String.Format("客户端 {0} 用户名 {1} 连接服务器", proxSocket.RemoteEndPoint.ToString(),name));                     String msg = String.Format("用户{0}上线了", name);                     sendMsg(msg);                     userContain[proxSocket] = name;//把对象放入集合中                     //不停的接受当前链接的客户端发送的消息                     ThreadPool.QueueUserWorkItem(new WaitCallback(this.recevie), proxSocket);                 }                 catch                 {                     MessageBox.Show("接受异常");                     break;                 }             }         }         private void recevie(object socket)         {             var proxSocket = socket as Socket;             byte[] data = new byte[1024 * 1024];//接受,发送数据缓冲区             String msg;             int len = 0; // 数据长度             String name = userContain[proxSocket]; // 客户端名字             while (true)             {                 try                 {                     len = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);                 }                 catch                 {                     msg = String.Format("客户端{0}异常退出",                     proxSocket.RemoteEndPoint.ToString());                     showLog(msg);                     msg = String.Format("用户{0}下线了", name);                     sendMsg(msg);                     userContain.Remove(proxSocket);                     stopConnect(proxSocket);                     return;                 }                 if (len <= 0)                 {                     //客户端正常退出                     msg = String.Format("客户端{0}正常退出",                     proxSocket.RemoteEndPoint.ToString());                     showLog(msg);                     msg = String.Format("用户{0}下线了", name);                     sendMsg(msg);                     userContain.Remove(proxSocket);                     stopConnect(proxSocket);                     return;//结束当前接受客户端数据的异步线程                 }                 //接受消息                 msg = Encoding.Default.GetString(data, 0, len);                 //私聊信息格式@name:msg                 //name 为用户名 msg 为消息                 bool flag = true;                 if (msg.StartsWith("@"))                 {                     int index = msg.IndexOf(":");                     String targetName = msg.Substring(1, index-1);                     msg = msg.Substring(index + 1);                     foreach(var user in userContain)                     {                         if(targetName.Equals(user.Value)&&user.Key.Connected)                         {                             msg = String.Format("用户{0} 单独对你说:{1}",name,msg);                             data = Encoding.Default.GetBytes(msg);                             user.Key.Send(data, 0, data.Length, SocketFlags.None);                             flag = false;                             break;                         }                     }                 }                 if (flag)                 {                     msg = String.Format("用户{0}:{1}", name, msg);                     sendMsg(msg);                 }             }         }         private void stopConnect(Socket socket)         {             try             {                 if (socket.Connected)                 {                     socket.Shutdown(SocketShutdown.Both);                     socket.Close(100);                 }             }             catch             {             }         }         private void showLog(String msg)         {             if (textBoxLog.InvokeRequired)             {                 //如果是跨线程访问                 textBoxLog.Invoke(new Action<String>(                    s => {                        this.textBoxLog.Text += msg+"\r\n";                     }),msg);             }             else             {                 this.textBoxLog.Text += msg;             }         }         private void buttonSend_Click(object sender, EventArgs e)         {             //发送消息             String msg = String.Format("服务器发布通知信息{0}", textBoxMsg.Text);             sendMsg(msg);         }         private void sendMsg(String msg)         {             byte[] data = new byte[1024 * 1024];             data = Encoding.Default.GetBytes(msg);             foreach (var user in userContain)             {                 if (user.Key.Connected)                 {                      user.Key.Send(data, 0, data.Length, SocketFlags.None);                 }             }         }     } }



服务端 C# websocket

需要 登录 后方可回复, 如果你还没有账号请 注册新账号