C#制作简单的多人在线即时交流聊天室

这里是 C# 制作简单的多人在线即时交流聊天室的攻略。下面我们将分步骤介绍实现过程。

准备工作

  • 编程环境:Visual Studio 2017 或更高版本。
  • 知识储备:C# .NET 基础知识、Socket 编程、多线程编程、WinForm 界面开发等。

实现步骤

1. 创建 WinForm 应用程序

打开 Visual Studio,创建一个新的 WinForm 应用程序项目。该项目的名字为 ChatRoom。

2. 设计聊天界面

在设计窗口中添加四个控件,以实现多人即时聊天室:

  • 一个 ListBox 控件,用于显示聊天记录。
  • 一个 TextBox 控件,用于输入发送的内容。
  • 一个 Button 控件,用于发送消息。
  • 一个 Label 控件,用于显示在线用户的数量。

3. 实现服务器端

服务器端将使用 C# Socket 编程实现。在解决方案资源管理器中创建一个名为 Server 的新控制台应用程序项目,并添加以下代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace Server {
    class Program {
        static Hashtable clientsList = new Hashtable();

        static void Main(string[] args) {
            TcpListener serverSocket = new TcpListener(IPAddress.Any, 8080);
            TcpClient clientSocket = default(TcpClient);
            int counter = 0;

            serverSocket.Start();
            Console.WriteLine("Server started...");

            while (true) {
                counter += 1;
                clientSocket = serverSocket.AcceptTcpClient();

                byte[] bytesFrom = new byte[clientSocket.ReceiveBufferSize];
                string dataFromClient = null;

                NetworkStream networkStream = clientSocket.GetStream();
                networkStream.Read(bytesFrom, 0, clientSocket.ReceiveBufferSize);
                dataFromClient = Encoding.Unicode.GetString(bytesFrom);
                dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));

                clientsList.Add(dataFromClient, clientSocket);

                Broadcast(dataFromClient + " joined ", dataFromClient, false);

                Console.WriteLine(dataFromClient + " joined chat room ");
                handleClient client = new handleClient();
                client.startClient(clientSocket, dataFromClient, clientsList);
            }

            clientSocket.Close();
            serverSocket.Stop();

            Console.WriteLine("exit");
            Console.ReadLine();
        }

        public static void Broadcast(string msg, string uName, bool flag) {
            foreach (DictionaryEntry Item in clientsList) {
                TcpClient broadcastSocket;
                broadcastSocket = (TcpClient)Item.Value;
                NetworkStream broadcastStream = broadcastSocket.GetStream();
                Byte[] broadcastBytes = null;

                if (flag) {
                    broadcastBytes = Encoding.Unicode.GetBytes(uName + " says : " + msg);
                } else {
                    broadcastBytes = Encoding.Unicode.GetBytes(msg);
                }

                broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length);
                broadcastStream.Flush();
            }
        }
    }

    public class handleClient {
        TcpClient clientSocket;
        string clNo;
        Hashtable clientsList;

        public void startClient(TcpClient inClientSocket, string clineNo, Hashtable cList) {
            this.clientSocket = inClientSocket;
            this.clNo = clineNo;
            this.clientsList = cList;
            Thread ctThread = new Thread(doChat);
            ctThread.Start();
        }

        private void doChat() {
            byte[] bytesFrom = new byte[clientSocket.ReceiveBufferSize];
            string dataFromClient = null;

            while (true) {
                try {
                    NetworkStream networkStream = clientSocket.GetStream();
                    networkStream.Read(bytesFrom, 0, clientSocket.ReceiveBufferSize);
                    dataFromClient = Encoding.Unicode.GetString(bytesFrom);
                    dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));

                    Program.Broadcast(dataFromClient, clNo, true);
                } catch {
                    Console.WriteLine(clNo + " disconnected");
                    clientsList.Remove(clNo);
                    Broadcast(clNo + " disconnected", "", false);
                    break;
                }
            }
        }

        public void Broadcast(string msg, string uName, bool flag) {
            byte[] broadcastBytes = null;

            if (flag) {
                broadcastBytes = Encoding.Unicode.GetBytes(uName + " says : " + msg);
            } else {
                broadcastBytes = Encoding.Unicode.GetBytes(msg);
            }

            NetworkStream broadcastStream = clientSocket.GetStream();
            broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length);
            broadcastStream.Flush();
        }
    }
}

4. 实现客户端

客户端也使用 C# Socket 编程实现。在 ChatRoom 项目中添加一个新的类,名为 ChatClient,并添加以下代码:

using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace ChatRoom {
    public partial class ChatClient : Form {
        private TcpClient clientSocket = new TcpClient();
        private NetworkStream serverStream = default(NetworkStream);
        private string readData = null;

        public ChatClient() {
            InitializeComponent();
        }

        private void btnConnect_Click(object sender, EventArgs e) {
            readData = "Connecting to chat room server...";
            msg();
            clientSocket.Connect("127.0.0.1", 8080);
            serverStream = clientSocket.GetStream();

            byte[] outStream = Encoding.Unicode.GetBytes(txtUser.Text + "$");
            serverStream.Write(outStream, 0, outStream.Length);
            serverStream.Flush();

            Thread ctThread = new Thread(getMessage);
            ctThread.Start();
        }

        private void btnSend_Click(object sender, EventArgs e) {
            byte[] outStream = Encoding.Unicode.GetBytes(txtMsg.Text + "$");
            serverStream.Write(outStream, 0, outStream.Length);
            serverStream.Flush();
            txtMsg.Text = "";
        }

        private void getMessage() {
            while (true) {
                serverStream = clientSocket.GetStream();
                int buffSize = 0;
                byte[] inStream = new byte[clientSocket.ReceiveBufferSize];
                buffSize = clientSocket.ReceiveBufferSize;
                serverStream.Read(inStream, 0, buffSize);
                string returndata = Encoding.Unicode.GetString(inStream);
                readData = "" + returndata;
                msg();
            }
        }

        private void msg() {
            if (InvokeRequired) {
                this.Invoke(new MethodInvoker(msg));
            } else {
                lstChat.Items.Add(readData);
            }
        }
    }
}

5. 编译并运行聊天室

编译两个项目,启动 ChatRoom 服务器应用程序,并运行 ChatClient 客户端应用程序。在客户端中输入用户名,然后单击“连接”按钮即可加入聊天室。在聊天室中输入消息,然后按下“发送”按钮即可将消息发送给所有在线用户。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#制作简单的多人在线即时交流聊天室 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • NetCore实现全局模型绑定异常信息统一处理(场景分析)

    NetCore实现全局模型绑定异常信息统一处理(场景分析) 在.NetCore应用程序中,模型绑定是将HTTP请求中的数据绑定到控制器的操作方法参数上的过程。当模型绑定失败时,应用程序将抛出异常。本攻略将介绍如何在.NetCore应用程序中实现全局模型绑定异常信息统一处理,并提供两个示例说明。 场景分析 在.NetCore应用程序中,当模型绑定失败时,应用程…

    C# 2023年5月16日
    00
  • c# 抓取Web网页数据分析

    C# 抓取 Web 网页数据分析攻略 在使用 C# 抓取网页数据进行数据分析的过程中,主要需要做以下几个步骤: 发送 HTTP 请求,并获取网页 HTML 内容。 使用正则表达式或其他技术从 HTML 中提取需要的数据。 分析数据并进行处理,例如存储到数据库,生成报表,或进行可视化等操作。 下面将用示例说明这些步骤。 步骤一:发送 HTTP 请求并获取网页 …

    C# 2023年6月2日
    00
  • C#泛型集合类System.Collections.Generic

    概述:C#泛型集合类System.Collections.Generic是.NET框架中最常用的一些类之一。泛型集合类可以存储不同类型的元素,并且支持各种常见的操作,如添加、删除、查找、排序等。泛型集合类通过定义泛型类型参数实现类型安全,这使得代码更加可读、可维护、可扩展。本文将介绍System.Collections.Generic泛型集合类的完整攻略,掌…

    C# 2023年5月15日
    00
  • 认识ASP.NET配置文件Web.config

    ASP.NET配置文件Web.config是ASP.NET应用程序的核心文件,用于配置应用程序的行为和设置,在ASP.NET应用程序的开发和部署过程中,了解和操作Web.config文件是必不可少的。下面是认识ASP.NET配置文件Web.config的完整攻略: 1. Web.config文件的作用 Web.config文件是ASP.NET应用程序最常用的…

    C# 2023年5月31日
    00
  • ASP.NET Core – 缓存之分布式缓存

    分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护。 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时。 与其他将缓存数据存储在单个应用服务器上的缓存方案相比,分布式缓存具有多个优势。 当分发缓存数据时,数据: 在多个服务器的请求之间保持一致(一致性)。 在进行服务器重…

    C# 2023年4月19日
    00
  • c# 字符串操作总结

    C#字符串操作总结 在C#中,字符串是一种常用的数据类型。C#提供了许多内置方法和库函数来操作和处理字符串。本篇攻略将介绍C#的常见字符串操作和用法总结。 字符串的定义 在C#中,字符串是用引号(单引号或双引号)括起来的一系列字符。例如: string str1 = "hello"; string str2 = "world&q…

    C# 2023年5月15日
    00
  • C#基于COM方式读取Excel表格的方法

    下面是C#基于COM方式读取Excel表格的方法的完整攻略。 一、前置条件准备 在使用C#基于COM方式读取Excel表格之前,需要先安装Microsoft Office软件(建议安装MS Office 2010及以上版本),并且安装后需要以管理员身份运行Excel至少一次,以防Excel第一次运行时的初始化过程出错。 二、在C#中使用Excel COM组件…

    C# 2023年6月8日
    00
  • C#基于NPOI操作Excel

    下面是“C#基于NPOI操作Excel”的完整攻略: 1. 简介 NPOI是一个.NET平台下的开源组件,支持读写Office2007及以上版本(.xlsx/.docx)的Excel/Word文件。NPOI官方文档详细说明了如何在项目中使用NPOI进行对Excel文件的操作。在本文中,我们将详细介绍C#基于NPOI操作Excel的过程。 2. 安装 在Vis…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部