文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#中怎么用websocket实现简易聊天功能

2023-06-29 03:36

关注

本篇内容主要讲解“C#中怎么用websocket实现简易聊天功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#中怎么用websocket实现简易聊天功能”吧!

前言

界面

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实现简易聊天功能”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯