C#基于Socket的TCP通信实现聊天室案例

下面将为您详细讲解“C#基于Socket的TCP通信实现聊天室案例”的完整攻略。

一、概述

本文将介绍如何使用C#语言基于Socket实现TCP协议的聊天室案例,并提供两条示例说明。

二、准备工作

在开始之前,我们需要保证以下几点:

  1. 本地已安装Visual Studio或其他C#开发工具;
  2. 了解Socket编程基础知识,比如Socket的创建、套接字的监听、接收和发送数据等操作;
  3. 确保本地已经开启TCP协议的端口,作为聊天室的服务端需要开启需要用到的端口。

三、实现思路

这里我们将介绍一个简单的聊天室实现思路:

  1. 创建服务端和客户端;
  2. 服务端监听客户端的连接请求,一旦有客户端连接上来,就将其加入到连接池中;
  3. 客户端连接服务端,建立连接;
  4. 客户端可以向服务端发送消息,服务端接收到消息后将其广播给所有处于连接池中的客户端;
  5. 客户端接收到服务端广播的消息后,将消息显示在自己的聊天窗口中。

四、代码实现

示例一:服务端

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

namespace TCPServerDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建Socket对象
            Socket ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            // 服务端IP地址和端口号
            string IP = "127.0.0.1";
            int Port = 8888;

            // 绑定IP和端口号,并监听连接请求
            ServerSocket.Bind(new System.Net.IPEndPoint(System.Net.IPAddress.Parse(IP), Port));
            ServerSocket.Listen(10);

            Console.WriteLine("服务端已启动,等待客户端请求...");

            // 无限循环监听客户端请求
            while (true)
            {
                Socket clientSocket = ServerSocket.Accept();

                // 新开线程处理客户端请求
                Thread thread = new Thread(ReceiveMessage);
                thread.Start(clientSocket);
            }
        }

        /// <summary>
        /// 接收消息并处理
        /// </summary>
        static void ReceiveMessage(object obj)
        {
            Socket clientSocket = (Socket)obj;

            // 接收消息
            byte[] buffer = new byte[1024];
            int length = clientSocket.Receive(buffer);

            // 将接收到的消息转换为字符串
            string message = Encoding.UTF8.GetString(buffer, 0, length);

            Console.WriteLine("收到客户端消息:" + message);

            // 将接收到的消息发送给所有客户端
            byte[] sendMessage = Encoding.UTF8.GetBytes(message);
            clientSocket.Send(sendMessage);

            // 关闭连接
            clientSocket.Shutdown(SocketShutdown.Both);
            clientSocket.Close();
        }
    }
}

示例二:客户端

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

namespace TCPClientDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("请输入要发送的消息:");
            string message = Console.ReadLine();

            // 创建Socket对象,用于连接服务端
            Socket ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            // 服务端IP地址和端口号
            string IP = "127.0.0.1";
            int Port = 8888;

            // 连接服务端
            ClientSocket.Connect(IP, Port);

            // 向服务端发送消息
            byte[] sendMessage = Encoding.UTF8.GetBytes(message);
            ClientSocket.Send(sendMessage);

            // 接收服务端发回的数据
            byte[] buffer = new byte[1024];
            int length = ClientSocket.Receive(buffer);

            // 将接收到的数据转换为字符串
            string receivedMessage = Encoding.UTF8.GetString(buffer, 0, length);

            Console.WriteLine("服务端返回的消息:" + receivedMessage);

            // 关闭连接
            ClientSocket.Shutdown(SocketShutdown.Both);
            ClientSocket.Close();

            Console.ReadKey();
        }
    }
}

五、实现效果

通过以上两个示例,我们可以实现简单的聊天室效果。启动服务端,等待客户端请求,客户端连接服务端后,可以向服务端发送消息,服务端接收到消息后将其广播给所有客户端,所有客户端都可以收到和发送消息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#基于Socket的TCP通信实现聊天室案例 - Python技术站

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

相关文章

  • asp.net动态加载自定义控件的方法

    下面我将详细讲解asp.net动态加载自定义控件的方法。 什么是动态加载自定义控件? 在asp.net中,页面上的控件都是静态的,它们需要在页面创建时就定义好并放置在页面上。而动态加载自定义控件则是指在程序运行时,根据需要再将控件添加进页面中。 动态加载自定义控件的方法 在asp.net中,有两种动态加载自定义控件的方法,分别是基于Page对象和基于Cont…

    C# 2023年6月3日
    00
  • 分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了

    分布式锁是在分布式系统中常用的一种性能优化方案,用于解决多节点对共享资源的同时访问问题。为了实现分布式锁,可以选择多种技术栈,常见的有Zookeeper、Redis等。而在这些技术栈中,为什么Zookeeper比Redis更适合作为分布式锁的实现呢? 1. Zookeeper的数据一致性 Zookeeper是一个开源的分布式协调服务框架,用于协调多个节点之间…

    C# 2023年5月31日
    00
  • unity shader 较完整光照(含有多光源阴影)

    在Unity引擎中,开发者可以使用Shader编写自定义着色器,来实现对游戏场景中的模型、材质进行更加高级的渲染。其中,光照是Shader编写中十分重要的一个环节,一个较完整的光照着色器需要包括基础光照、多光源、阴影等要素。下面介绍一些实现这些功能的方法: 1. 基础光照 在Unity中,使用Built-in Shader中的“Surface Shader”…

    C# 2023年6月3日
    00
  • C#使用stackalloc分配堆栈内存和非托管类型详解

    关于“C#使用stackalloc分配堆栈内存和非托管类型详解”的完整攻略,下面是我提供的细致讲解。 1. stackalloc简介 stackalloc是C#语言的一种内存分配语法,可以用来在栈上分配存储空间。在使用stackalloc时,必须是将堆栈分配内存全部使用完毕之后才会自动释放,也就是说它分配的内存无法被回收。 使用stackalloc分配内存时…

    C# 2023年6月6日
    00
  • c# 将Datatable数据导出到Excel表格中

    下面是将Datatable数据导出到Excel表格中的完整攻略。 1. 准备工作 在开始操作之前,需要确保已经将NPOI引入到项目中。可以通过NuGet包管理器或手动下载NPOI工具包的方式引入。 2. 代码实现 在代码中需要引入以下命名空间: using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using…

    C# 2023年5月31日
    00
  • C#三种方法获取文件的Content-Type(MIME Type)

    首先,我们需要理解什么是 Content-Type(MIME Type)。Content-Type(MIME Type) 是 HTTP 协议头中一部分,用于描述资源的类型。常见的 MIME类型包括:text/html、application/json、image/png 等等。 在 C# 中获取文件的 Content-Type(MIME Type) 有三种方…

    C# 2023年5月31日
    00
  • 关于C#中yield return用法的思考

    关于C#中yield return用法的完整攻略如下: 1. 什么是yield return yield return 是C#中的迭代器语法。简单来说,它允许我们一次性返回一组值的序列,而不需要在内存中维护它们的列表。 C# 的 yield 关键字使得我们可以定义一种流式处理的方式。被yield 关键字所标记的方法返回一个IEnumerable 接口对象,使…

    C# 2023年6月6日
    00
  • c# 命名空间和程序集

    C# 中的命名空间和程序集是重要概念,理解它们的概念和用法可以帮助程序员更好地组织代码和模块化开发。本篇攻略将全面介绍 C# 中的命名空间和程序集。 命名空间 概念 命名空间是用于组织代码的一种方式。它可以包含类型、变量、常量和其他命名空间。命名空间通过隔离不同的代码区域,避免了名称冲突,在代码模块化中起到了重要的作用。 语法 在 C# 中,使用 names…

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