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#中一些可能没用过的调试窗口的完整攻略。 1. 数据视图窗口 数据视图窗口用于查看和编辑调试器中的变量。在Visual Studio中打开调试器并在断点处暂停程序,可以通过选择“调试”选项卡下的“窗口”→“数据视图”打开数据视图窗口。此窗口列出当前可用的变量,允许开发人员查看和编辑这些变量的内容。另外,单击窗口顶部的“+”号,可以添加新的变量。 以下…

    C# 2023年6月6日
    00
  • C# GetHashcode():返回当前实例的哈希代码

    首先,C#中的GetHashCode()方法是一个用于获取对象哈希码的函数,用于将对象的状态转换为一串数字,以便在哈希表等数据结构中进行高效查找。它返回一个int类型的哈希值,可以作为该对象在哈希表中的索引值。 GetHashCode()的实现方式可能因为不同的开发者或.NET Framework版本而有所不同,但常见的默认实现是通过将对象中的字段或属性(称…

    C# 2023年4月19日
    00
  • 关于ASP网页无法打开的解决方案

    关于ASP网页无法打开的解决方案 ASP(Active Server Pages)是一种动态网页技术,常用于Web应用程序的开发。但在使用ASP技术的网站中,有时会出现ASP网页无法打开的情况,本文将为您提供几种解决方案。 检查ASP环境 确保ASP环境是否正常。如果您的服务器上没有安装IIS(Internet Information Services)或没…

    C# 2023年6月3日
    00
  • Vs2022环境下安装低版本.net framework的实现步骤

    下面是详细的“Vs2022环境下安装低版本.net framework的实现步骤”的攻略。 环境准备 首先,我们需要准备好以下一些环境: Visual Studio 2022 低版本的 .NET Framework 安装包(例如 .NET Framework 3.5) 安装低版本的 .NET Framework 在 Windows 系统中,打开“控制面板”,…

    C# 2023年6月3日
    00
  • 深入理解C#管道式编程

    C#管道式编程是一种基于流(stream)和操作(operation)组合的编程模式,它可以将复杂的处理过程分解成简单可复用的操作,再通过管道链接起来,形成一个数据流处理管道,从而实现高效、灵活、可维护的数据处理逻辑。 以下是深入理解C#管道式编程的完整攻略: 什么是管道式编程 管道式编程可以理解成一种数据流处理模式。在管道式编程中,数据流动沿着一条管道,每…

    C# 2023年6月1日
    00
  • C# Directory.GetFiles(string path):获取指定目录下的所有文件路径

    Directory.GetFiles(string path) 是C#中的一个静态方法,它返回指定目录中文件的名称,包括该目录中的所有子目录。它是 DirectoryInfo 类的一个实例方法 GetFiles 的静态等效方法。 方法签名 public static string[] GetFiles(string path); public static …

    C# 2023年4月19日
    00
  • Unity实现俄罗斯方块(二)

    Unity实现俄罗斯方块(二)攻略 1. 前言 在上一篇文章《Unity实现俄罗斯方块(一)》中,我们实现了俄罗斯方块游戏的基本框架,包括生成指定形状的方块、方块下落、方块旋转、消行等基本功能。接下来,我们在这个基础上,继续实现俄罗斯方块游戏的其他功能,包括左右移动和加速下落。 下面,我们就一步一步来详细讲解如何实现这些功能。 2. 左右移动 在俄罗斯方块游…

    C# 2023年6月1日
    00
  • c# this关键字用法代码详解

    c# this关键字用法代码详解 简介 在 C# 编程中,this 关键字用于引用当前对象或当前实例。 它通常用于以下情况: 当当前对象的属性隐藏局部变量时,可使用 this 关键字来引用当前对象的属性。 当当前对象的方法调用另一个方法时,可使用 this 关键字将当前对象传递给另一个方法。 当在构造函数中使用 this 关键字时表示当前实例(正在构造的实例…

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