iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#用websocket实现简易聊天功能(服务端)
  • 770
分享到

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

2024-04-02 19:04:59 770人浏览 薄情痞子
摘要

C# 利用websocket实现简易聊天功能——服务端,供大家参考,具体内容如下 前言 使用C#语言进行开发,基于.net FrameWork4功能包含群聊,

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);
                }
            }
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#用websocket实现简易聊天功能(服务端)

本文链接: https://www.lsjlt.com/news/138895.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#用websocket实现简易聊天功能(服务端)
    C# 利用websocket实现简易聊天功能——服务端,供大家参考,具体内容如下 前言 使用C#语言进行开发,基于.NET FrameWork4功能包含群聊,...
    99+
    2024-04-02
  • C#用websocket实现简易聊天功能(客户端)
    本文实例为大家分享了C#用websocket实现简易聊天功能的具体代码,供大家参考,具体内容如下 前言 使用C#语言进行开发,基于.NET FrameWork4功能包含群聊,和私聊参...
    99+
    2024-04-02
  • C#中怎么用websocket实现简易聊天功能
    本篇内容主要讲解“C#中怎么用websocket实现简易聊天功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#中怎么用websocket实现简易聊天功能”吧!前言使用C#语言进行开发,基于....
    99+
    2023-06-29
  • ASP.net(C#)实现简易聊天室功能
    本文实例为大家分享了ASP.net(C#)实现简易聊天室功能的具体代码,供大家参考,具体内容如下 1.搭建框架 <html > <head>     <...
    99+
    2024-04-02
  • Vue+Websocket简单实现聊天功能
    本文实例为大家分享了Vue+Websocket简单实现聊天功能的具体代码,供大家参考,具体内容如下 效果图: 聊天室 此篇文章是针对Websocket的简单了解和应用,利用Node...
    99+
    2024-04-02
  • java实现简易聊天功能
    本文实例为大家分享了java实现简易聊天功能的具体代码,供大家参考,具体内容如下 应用客户端和服务端通过控制台的输入输出实现简易聊天功能 思路: 1.创建服务端类ChatServer...
    99+
    2024-04-02
  • C#使用WebSocket实现聊天室功能
    WebSocket介绍 WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 在WebSocket API中,浏览器和服务器只需要做一个握手的动作...
    99+
    2024-04-02
  • node+socket实现简易聊天室功能
    本文实例为大家分享了node+socket实现简易聊天室的具体代码,供大家参考,具体内容如下 服务端 const net = require('net') const serv...
    99+
    2024-04-02
  • C#基于WebSocket实现聊天室功能
    本文实例为大家分享了C#基于WebSocket实现聊天室功能的具体代码,供大家参考,具体内容如下 前面两篇温习了,C# Socket内容 本章根据Socket异步聊天室修改成WebS...
    99+
    2024-04-02
  • vue实现websocket客服聊天功能
    本文章主要介绍如何实现一个基本的聊天,后续会添加表情包,传照片等功能 其实刚开始接触的时候,我最大的疑惑是聊天功能的前期是否需要搭建什么框架、下载一些什么东西之类的,结果就是,其实w...
    99+
    2024-04-02
  • golang实现一个简单的websocket聊天室功能
    基本原理: 1.引入了 golang.org/x/net/websocket 包。 2.监听端口。 3.客户端连接时,发送结构体: {"type":"login","uid":"我是...
    99+
    2024-04-02
  • Springboot+WebSocket实现在线聊天功能
    目录一、后端二、Websocket三、前端一、后端 1.在Springboot项目的pom.xml中添加依赖 <!--websocket协议--> <depende...
    99+
    2023-02-14
    Springboot WebSocket在线聊天 Springboot WebSocket聊天 Springboot WebSocket
  • Java聊天室之实现聊天室服务端功能
    目录一、题目描述二、解题思路三、代码详解多学一个知识点一、题目描述 题目实现:实现聊天室服务器端功能。运行程序,服务端等待客户端连接,并显示客户端的连接信息。 二、解题思路 创建一个...
    99+
    2022-11-13
    Java实现聊天室 Java 聊天室 Java 服务端
  • C#实现简易多人聊天室
    本文实例为大家分享了C#实现简易多人聊天室的具体代码,供大家参考,具体内容如下 只有一个群聊的功能 服务端 using System; using System.Collectio...
    99+
    2024-04-02
  • 如何使用C#基于WebSocket实现聊天室功能
    这篇文章将为大家详细讲解有关如何使用C#基于WebSocket实现聊天室功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。ServerHelper:using System;using ...
    99+
    2023-06-29
  • vue使用WebSocket模拟实现聊天功能
    效果展示 两个浏览器相互模拟 1.创建模拟node服务 在vue根目录下创建 server.js 文件模拟后端服务器 **在server终端目录下载 ** npm insta...
    99+
    2024-04-02
  • C++实现简易UDP网络聊天室
    本文实例为大家分享了C++实现简易UDP网络聊天室的具体代码,供大家参考,具体内容如下 工程名:NetSrv NetSrv.cpp //服务器端 #include<Wins...
    99+
    2024-04-02
  • C语言实现简单的聊天室功能
    用C语言实现简单的聊天室功能,供大家参考,具体内容如下 服务器端 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> ...
    99+
    2024-04-02
  • 基于websocket的聊天功能怎么实现
    本篇内容主要讲解“基于websocket的聊天功能怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于websocket的聊天功能怎么实现”吧!   一...
    99+
    2024-04-02
  • 如何用JS WebSocket实现简单聊天
    目录短轮询(Polling)长轮询(Long-Polling)WebSocket通信原理实现简单单聊心跳保活总结短轮询(Polling) 短轮询的实现思路就是浏览器端每隔几秒钟向服务...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作