C#用websocket實現簡易聊天功能(服務端)
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); } } } } }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。