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# 生转换网页为pdf

    下面我将详细讲解C#如何实现将网页转换为PDF的完整攻略,包括步骤和代码示例。 步骤1:下载使用合适的PDF组件 要生成PDF文件,我们需要使用PDF生成组件。C#中常用的PDF组件包括iTextSharp、PDFSharp以及Winnovative等。这里,我们以iTextSharp为例,进行讲解。 步骤2:创建一个PDF文档对象 在使用iTextShar…

    C# 2023年6月6日
    00
  • C#中循环语句:while、for、foreach的使用

    C#中循环语句:while、for、foreach的使用 循环语句是编程中非常常用的语句结构之一。C#语言中提供了三种不同的循环语句,分别是while、for和foreach。在这篇文章中,我们将详细讲解这三种循环语句的用法,包括其语法、示例和注意事项。 while循环 while循环在执行时,先判断循环条件是否满足,如果满足则执行循环体中的语句,然后再次判…

    C# 2023年6月7日
    00
  • .NET Core 使用委托实现动态流程组装的思路详解

    .NET Core 使用委托实现动态流程组装的思路详解 在.NET Core应用程序中,我们经常需要根据不同的条件动态组装流程。使用委托可以很好地实现这一目的。本攻略将介绍如何使用委托实现动态流程组装,并提供两个示例说明。 1. 委托的定义 在.NET Core中,委托是一种类型,它可以封装一个或多个方法,并允许将这些方法作为参数传递给其他方法。委托可以用于…

    C# 2023年5月16日
    00
  • 利用C#实现AOP常见的几种方法详解

    利用C#实现AOP常见的几种方法详解 AOP(Aspect-Oriented Programming)是面向切面编程的缩写,它是一种编程思想,通过将程序中的通用功能(如日志记录、异常处理、性能统计等)抽象出来,无需修改原始代码,就可以为各个类或方法注入通用功能。AOP技术的主要优点在于可以提高代码的重用性、可维护性和可扩展性。 C#是一种面向对象的编程语言,…

    C# 2023年5月15日
    00
  • 详解C#中Helper类的使用

    当我们在C#编程中遇到某些复杂的操作时,我们可以借助 Helper 类来简化代码的编写和实现。本文将详解 C# 中 Helper 类的使用,希望能够对大家有所帮助。 1.什么是 Helper 类 Helper 类(助手类)是一个静态类,它通常包含一些静态方法,用于封装一些常见的功能以及处理细节问题。 在开发中,我们可以结合实际需求来定义和使用 Helper …

    C# 2023年5月31日
    00
  • 深入浅析C#中单点登录的原理和使用

    深入浅析C#中单点登录的原理和使用 单点登录 (Single Sign-On, SSO) 是一种常见的身份认证方式,允许用户在多个应用中使用同一套凭据进行登录,而不需要重复输入用户名和密码。本文将详细讲解 C# 中单点登录的原理和使用。 原理 单点登录的实现原理涉及到以下三个方面: 身份认证 凭据共享 会话管理 身份认证 在单点登录过程中,用户只需要认证一次…

    C# 2023年5月31日
    00
  • 利用FlubuCore用C#来写DevOps脚本的方法详解

    FlubuCore是一个用于构建和部署.NET应用程序的开源工具。它使用C#编写,可以帮助我们编写DevOps脚本,自动化构建和部署过程。在本文中,我们将介绍如何使用FlubuCore编写DevOps脚本,并提供两个示例说明。 安装FlubuCore 在开始之前,我们需要安装FlubuCore。我们可以使用NuGet包管理器或手动下载安装程序包。在Visua…

    C# 2023年5月17日
    00
  • 基于C#生成条形码操作知识汇总附源码下载

    基于C#生成条形码操作知识汇总 什么是条形码? 条形码(英文:Barcode)是用一组粗细不同、间距不同且被平行分成若干个基本单元的直线条及空白,按一定的编码规则,代表不同的字符信息,并经过光电扫描或照相机扫描得到的一种自动识别技术。 C# 中生成条形码的方式 在C#中,可以通过使用各种第三方库和自定义代码的方式来生成条形码。其中主要的几种库包括: ZXin…

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