中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中怎么用websocket實現簡易聊天功能

發布時間:2022-02-14 16:51:30 來源:億速云 閱讀:387 作者:iii 欄目:開發技術

本篇內容主要講解“C#中怎么用websocket實現簡易聊天功能”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C#中怎么用websocket實現簡易聊天功能”吧!

前言

  • 使用C#語言進行開發,基于.NET FrameWork4

  • 功能包含群聊,和私聊

界面

C#中怎么用websocket實現簡易聊天功能

界面設計代碼

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實現簡易聊天功能”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

五常市| 正阳县| 尖扎县| 彭阳县| 仪陇县| 友谊县| 鄂伦春自治旗| 加查县| 秦安县| 泗阳县| 垣曲县| 周至县| 虹口区| 二手房| 壤塘县| 连江县| 老河口市| 周至县| 蕉岭县| 邢台县| 平果县| 平舆县| 临桂县| 务川| 扶余县| 榆中县| 迁西县| 长春市| 葫芦岛市| 边坝县| 柳江县| 九江县| 吉林市| 漳州市| 阿拉善右旗| 武隆县| 泗阳县| 贺州市| 岢岚县| 六枝特区| 汪清县|