C#基于Socket实现简单聊天室功能

C#基于Socket实现简单聊天室功能攻略

简介

本攻略旨在介绍如何使用C#语言基于Socket实现一个简单聊天室的功能。在本攻略中,我们将使用Socket API来创建网络连接,使用TCP协议进行数据传输。

需要注意的是,本攻略主要面向有一定C#编程基础的读者,对Socket编程有一定了解。

步骤

以下是基于Socket实现简单聊天室功能的步骤:

第一步:创建服务端

首先,我们需要创建一个服务端来接受客户端的连接请求。在C#中,可以使用Socket类来创建一个TCP服务端。代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace SocketChatRoom
{
    class Server
    {
        private Socket serverSocket;
        private List<Socket> clientList;

        public Server()
        {
            // 创建一个IPv4 TCP Socket
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            // 绑定IP地址和端口号
            IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 1234);
            serverSocket.Bind(endPoint);

            // 开始监听连接
            serverSocket.Listen(10);
            Console.WriteLine("Server started.");

            // 创建客户端Socket列表
            clientList = new List<Socket>();

            // 开始等待连接请求
            while (true)
            {
                Socket clientSocket = serverSocket.Accept();
                Console.WriteLine("Accepted a client.");

                // 将客户端Socket加入列表
                clientList.Add(clientSocket);

                // 新开一个线程处理客户端消息
                Task.Factory.StartNew(() =>
                {
                    ReceiveMessage(clientSocket);
                });
            }
        }

        private void ReceiveMessage(Socket clientSocket)
        {
            // 创建缓存区
            const int bufferSize = 1024;
            byte[] buffer = new byte[bufferSize];

            while (true)
            {
                try
                {
                    // 接收客户端数据
                    int receiveSize = clientSocket.Receive(buffer);
                    string message = Encoding.UTF8.GetString(buffer, 0, receiveSize);
                    Console.WriteLine(message);

                    // 将消息转发给所有客户端
                    SendMessageToAllClients(message, clientSocket);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    clientList.Remove(clientSocket);
                    break;
                }
            }
        }

        private void SendMessageToAllClients(string message, Socket excludeClient)
        {
            // 将消息转发给所有客户端
            foreach (Socket client in clientList)
            {
                if (client != excludeClient)
                {
                    client.Send(Encoding.UTF8.GetBytes(message));
                }
            }
        }
    }
}

在上述代码中,我们创建了一个名为Server的类来表示服务端。在构造函数中,我们首先创建了一个IPv4 TCP Socket,并绑定了IP地址和端口号,然后开始监听连接。当一个客户端连接进来后,我们将其Socket加入到客户端列表中,并开启一个新的线程用于处理客户端的消息。在ReceiveMessage方法中,我们使用一个while循环不断接收客户端的数据,并将其转发给所有客户端。

需要注意的是,在每次接收完客户端的数据后,我们都需要将其转发给所有客户端。在SendMessageToAllClients方法中,我们遍历客户端列表,将消息发送给所有客户端(除了源客户端)。

第二步:创建客户端

接下来,我们需要创建一个客户端来连接服务端,并发送消息到服务端。在C#中,也可以使用Socket类来创建一个TCP客户端。代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace SocketChatRoom
{
    class Client
    {
        private Socket clientSocket;

        public Client()
        {
            // 创建一个IPv4 TCP Socket
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            // 连接服务端
            IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234);
            clientSocket.Connect(remoteEP);

            // 开始接收服务端消息
            Task.Factory.StartNew(() =>
            {
                ReceiveMessage();
            });

            // 不断从控制台读取用户输入,发送到服务端
            while (true)
            {
                string message = Console.ReadLine();

                // 发送消息到服务端
                clientSocket.Send(Encoding.UTF8.GetBytes(message));
            }
        }

        private void ReceiveMessage()
        {
            // 创建缓存区
            const int bufferSize = 1024;
            byte[] buffer = new byte[bufferSize];

            while (true)
            {
                try
                {
                    // 接收服务端数据
                    int receiveSize = clientSocket.Receive(buffer);
                    string message = Encoding.UTF8.GetString(buffer, 0, receiveSize);
                    Console.WriteLine(message);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    break;
                }
            }
        }
    }
}

在上述代码中,我们创建了一个名为Client的类来表示客户端。在构造函数中,我们首先连接服务端,然后开启一个新的线程用于接收服务端的消息。在ReceiveMessage方法中,我们使用一个while循环不断接收服务端的数据,并将其输出到控制台。在循环外部,我们不断从控制台读取用户输入,并将其发送到服务端。

第三步:测试聊天室

现在我们已经完成了服务端和客户端的创建。我们可以先启动一个服务端,并等待1个或多个客户端连接。接着,我们启动一个或多个客户端,并输入消息。在服务端和所有客户端中,我们都可以看到所有的消息。

示例

以下是两个示例:

示例一

在本示例中,我们将启动一个服务端和两个客户端,并观察他们之间的通信。

步骤

  1. 启动服务端;
  2. 启动客户端1;
  3. 启动客户端2;
  4. 在客户端1中输入消息“Hello, client2!”,并按回车键;
  5. 在客户端2中输入消息“Hi, client1! How are you?”,并按回车键;
  6. 观察服务端和所有客户端中的信息输出。

输出

服务端:

Server started.
Accepted a client.
Hello, client2!
Accepted a client.
Hi, client1! How are you?

客户端1:

Hello, client2!

客户端2:

Hi, client1! How are you?

示例二

在本示例中,我们将启动一个服务端和三个客户端,并观察他们之间的通信。

步骤

  1. 启动服务端;
  2. 启动客户端1;
  3. 启动客户端2;
  4. 启动客户端3;
  5. 在客户端1中输入消息“Hello, all!”,并按回车键;
  6. 观察服务端和所有客户端中的信息输出。

输出

服务端:

Server started.
Accepted a client.
Accepted a client.
Accepted a client.
Hello, all!

客户端1:

Hello, all!

客户端2:


客户端3:


从输出中我们可以看到,在服务端和客户端1中都能看到消息“Hello, all!”,而客户端2和客户端3没有任何输出。这是因为在本示例中,我们只是在客户端1中发送了消息,而在服务端中将消息转发给了所有客户端,因此只有服务端和客户端1中能够看到消息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#基于Socket实现简单聊天室功能 - Python技术站

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

相关文章

  • C#如何创建自定义特性

    C#中可以使用自定义特性来保存、检索和共享元数据,以及运行时行为。在此,我将为您提供有关如何创建自定义特性的完整攻略。 首先,了解自定义特性这个概念,一个特性其实就是一种自定义元数据,可以为程序中的类型、方法、属性、事件或者其他程序中的信息添加额外的信息。用户定义的特性是使用“Attribute”类进行定义的,其主要使用场景是在源代码级别的编程。通过使用特性…

    C# 2023年6月6日
    00
  • .NET Framework 3.5 Win11无法安装怎么办 .NET Framework3.5安装教程

    如果在Windows 11上安装.NET Framework 3.5时遇到问题,可以尝试以下解决方案: 1. 使用Windows 功能启用或禁用 Windows 11中已经预装了.NET Framework 3.5,但默认情况下未启用。因此,可以尝试使用Windows 功能启用或禁用来启用.NET Framework 3.5。以下是步骤: 打开“控制面板”并…

    C# 2023年5月15日
    00
  • 轻松学习C#的抽象类

    为了轻松学习C#的抽象类,您可以遵循以下步骤进行学习。 1.了解抽象类的定义和用途 抽象类是一个被声明为抽象的类,它不能被实例化,但是可以使用它的引用来引用其子类的对象。抽象类通常用于定义抽象方法,这些方法不包括任何实现细节,只是定义了子类必须实现的方法。抽象类还可以包括实现的方法和字段。 2.学习如何声明抽象类 要声明一个抽象类,您需要使用abstract…

    C# 2023年6月1日
    00
  • C#中HttpClient使用注意(预热与长连接)

    C#中HttpClient使用注意(预热与长连接) 在使用HttpClient时需要注意两个方面的问题:预热和长连接。本文将详细讲解这两方面的注意事项和实现方法。 预热 预热是指提前对HttpClient进行初始化,并使其保持一段时间的生命周期,以减少后续的请求延迟。一般来说,在使用HttpClient的应用中,HttpClient实例的创建、初始化和销毁都…

    C# 2023年6月6日
    00
  • C#实现发送手机验证码功能

    一、生成验证码 使用Random类生成随机数字或字母,示例代码如下: Random random = new Random(); string code = ""; for (int i = 0; i < 6; i++) { code += random.Next(10); } 将随机生成的验证码保存到Session中,代码如下: …

    C# 2023年6月6日
    00
  • Asp.net Core项目配置HTTPS支持

    下面是Asp.net Core项目配置HTTPS支持的完整攻略。 配置HTTPS支持 在项目中安装Microsoft.AspNetCore.HttpsPolicy包 PM> Install-Package Microsoft.AspNetCore.HttpsPolicy 修改ConfigureServices方法,在其中添加使用HttpsRedirec…

    C# 2023年6月3日
    00
  • C#中的checksum计算公式

    接下来我将为您详细讲解C#中的checksum计算公式的完整攻略。在计算checksum时,我们通常使用简单的数学算法。具体而言,我们通过将所有字节加起来并对其取模来计算checksum值。因为checksum值的计算方式相对简单,因此我们可以通过自己编写算法来计算checksum值。 以下为C#中的checksum计算公式示例: byte[] bytes …

    C# 2023年6月8日
    00
  • C#获取指定目录最后写入时间的方法

    关于C#获取指定目录最后写入时间的方法,可以使用FileInfo类中的LastWriteTime属性来实现。具体步骤如下: 步骤1. 引入命名空间 首先我们需要在代码文件中引入System.IO命名空间,因为FileInfo类是位于该命名空间下的。代码如下: using System.IO; 步骤2. 定义目录路径 接着,我们需要定义一个目录路径的字符串变量…

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