C#使用TcpListener及TcpClient开发一个简单的Chat工具实例

C#使用TcpListener及TcpClient开发一个简单的Chat工具实例是一个比较常见的网络编程应用场景。下面我将提供一个完整的攻略,指导如何实现该工具。

1. 需求分析

首先,我们需要明确Chat工具的需求。我们需要基于TCP协议实现一个聊天工具,并保持服务器端和客户端之间的连接。服务器需要接收客户端的消息,并将消息广播给所有连接。客户端需要能够连接服务器,发送消息给服务器,并接收服务器发来的消息。

2. TcpListener和TcpClient的概念

在进一步讲解之前,我们需要了解TcpListener和TcpClient的概念。

  • TcpListener是一个监听器,负责等待并接收TcpClient的连接请求。
  • TcpClient是一个用于与服务器建立TCP连接的客户端类。

3. 服务器端实现

3.1 创建TcpListener

首先,我们需要创建一个TcpListener对象,以便等待并接收客户端的连接请求。

TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 8888);

这里我们指定了本地的IP地址和端口号。

3.2 开始监听

调用TcpListener的Start()方法开始监听,等待客户端的连接请求。

server.Start();

3.3 接受客户端连接

使用AcceptTcpClient()方法接受客户端的连接请求,并返回一个TcpClient对象。

TcpClient client = server.AcceptTcpClient();

这里我们将接收到的客户端对象添加到一个列表中,然后循环处理客户端的连接请求。

while (true)
{
    TcpClient client = server.AcceptTcpClient();
    clients.Add(client);
    //Start a new thread to handle the connected client
    Thread t = new Thread(handleClient);
    t.Start(client);
}

3.4 处理客户端消息并广播

在上面的代码中,我们创建了一个名为handleClient的线程来处理客户端的消息。在handleClient方法中,我们需要读取客户端发送的消息,并将其广播给所有连接。

private void handleClient(object obj)
{
    TcpClient client = (TcpClient)obj;
    StreamReader reader = new StreamReader(client.GetStream(), Encoding.UTF8);
    while (true)
    {
        string message = reader.ReadLine();
        Console.WriteLine("Client: {0}", message);
        broadcastMessage(message);
    }
}

broadcastMessage方法负责向所有客户端广播消息。

private void broadcastMessage(string message)
{
    foreach (TcpClient client in clients)
    {
        StreamWriter writer = new StreamWriter(client.GetStream(), Encoding.UTF8);
        writer.WriteLine(message);
        writer.Flush();
    }
}

4. 客户端实现

4.1 创建TcpClient对象

在客户端中,我们需要通过TcpClient对象来连接服务器端。

TcpClient client = new TcpClient();
client.Connect(IPAddress.Parse("127.0.0.1"), 8888);

这里我们连接了指定IP地址和端口号的服务器。

4.2 发送消息

客户端可以使用TcpClient对象发送消息给服务器端。

StreamWriter writer = new StreamWriter(client.GetStream(), Encoding.UTF8);
writer.WriteLine(message);
writer.Flush();

4.3 接收消息

客户端也需要通过TcpClient对象接收服务器发来的消息。

StreamReader reader = new StreamReader(client.GetStream(), Encoding.UTF8);
while (true)
{
    string message = reader.ReadLine();
    Console.WriteLine("Server: {0}", message);
}

5. 示例说明

下面我们将给出一个客户端和服务器端的简单示例,以便更好地理解实现过程。其中我们只实现了一对一的对话,即客户端发一句话,服务器广播一句话给所有客户端。

服务器端示例

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace Server
{
    class Program
    {
        static List<TcpClient> clients = new List<TcpClient>();

        static void Main(string[] args)
        {
            TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 8888);
            server.Start();

            while (true)
            {
                TcpClient client = server.AcceptTcpClient();
                clients.Add(client);
                Thread t = new Thread(handleClient);
                t.Start(client);
            }
        }

        static void handleClient(object obj)
        {
            TcpClient client = (TcpClient)obj;
            StreamReader reader = new StreamReader(client.GetStream(), Encoding.UTF8);
            while (true)
            {
                string message = reader.ReadLine();
                Console.WriteLine("Client: {0}", message);
                broadcastMessage(message);
            }
        }

        static void broadcastMessage(string message)
        {
            foreach (TcpClient client in clients)
            {
                StreamWriter writer = new StreamWriter(client.GetStream(), Encoding.UTF8);
                writer.WriteLine(message);
                writer.Flush();
            }
        }
    }
}

客户端示例

using System;
using System.IO;
using System.Net.Sockets;
using System.Text;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpClient client = new TcpClient();
            client.Connect("127.0.0.1", 8888);

            while (true)
            {
                Console.Write("Enter message to send: ");
                string message = Console.ReadLine();
                StreamWriter writer = new StreamWriter(client.GetStream(), Encoding.UTF8);
                writer.WriteLine(message);
                writer.Flush();

                StreamReader reader = new StreamReader(client.GetStream(), Encoding.UTF8);
                string response = reader.ReadLine();
                Console.WriteLine("Server: {0}", response);
            }
        }
    }
}

运行上述代码,打开两个客户端分别作为不同的用户,即可通过在客户端输入框内输入文字后发送给服务器,其他客户端都可以收到服务器发来的广播内容。

结语

通过以上步骤和示例,我们学习了使用TcpListener和TcpClient实现一个简单的聊天工具的过程,并理解了TcpListener和TcpClient的概念和使用方法。基于该例子也可以拓展出更复杂的网络通信业务。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#使用TcpListener及TcpClient开发一个简单的Chat工具实例 - Python技术站

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

相关文章

  • c#语言程序构建基块

    下面是关于C#语言程序构建基块的详细讲解攻略。 1. 前置知识 在学习C#语言程序构建基块之前,需要先掌握以下基础知识: C#语言基础语法 常用数据类型和变量定义 控制流语句和循环语句 函数和方法 面向对象编程基础概念 如果你还没有掌握以上基础知识,建议先学习C#语言基础课程。 2. 程序构建基块 程序构建基块,也称为程序库,是指封装了特定功能的代码模块,可…

    C# 2023年5月15日
    00
  • ASP实现加法验证码

    实现加法验证码的过程可以分为以下几个步骤: 步骤一:生成加法算式 我们需要在服务器端生成一道简单的加法算式作为验证码,同时将其保存在会话(session)中,方便后续验证操作的进行。代码片段如下: <% Dim num1, num2, code Randomize ‘初始化随机数生成器 num1 = Int(Rnd() * 10) ‘生成0~9之间的随…

    C# 2023年6月1日
    00
  • C#各类集合汇总

    C# 各类集合汇总 在 C# 中有许多不同种类的集合,每种都有其特点和用途,下面对常用的一些集合进行简单的介绍和示例演示。 List List 是一种动态数组,可以根据需要调整大小。它可以用于存储任何类型的对象,尽管在大多数情况下它用于存储对象的列表。 下面是一个例子,展示如何在 List 中添加和访问元素: List<string> fruit…

    C# 2023年5月15日
    00
  • unity scrollRect实现按页码翻页效果

    下面是Unity中ScrollRect实现按页码翻页效果的攻略: 1. 需求分析 首先,我们需要明确我们的需求:利用ScrollRect制作一个翻页效果,实现按页码进行翻页操作。这意味着我们需要按照固定的大小拆分显示内容,每个页面的大小应该相同,并且在翻页时应该有一个平滑的过渡动画。 2. 设置ScrollRect参数 首先,我们需要在Unity中创建一个S…

    C# 2023年6月3日
    00
  • C#实现简单的聊天窗体

    C#实现简单的聊天窗体 1. 确定窗体样式和布局 简单的聊天窗体通常包含一个用于显示聊天记录的文本框,一个用于输入聊天信息的文本框和一个发送按钮。布局可以使用WinForm中自带的TableLayoutPanel或者Panel组件自行进行布局设置。 2. 实现简单的网络通信 为了实现聊天功能,我们需要使用一些网络通信相关的库来帮助我们达成通信的目标,例如.N…

    C# 2023年6月1日
    00
  • asp.net+ajax+sqlserver自动补全功能实现解析

    ASP.NET是一种用于创建Web应用程序的技术,它可以与AJAX和SQL Server等技术结合使用,实现各种功能。本文将介绍如何使用ASP.NET、AJAX和SQL Server实现自动补全功能。 步骤一:创建ASP.NET项目 首先,需要创建一个ASP.NET项目。可以使用Visual Studio创建一个新的ASP.NET项目。在创建项目时,可以选择…

    C# 2023年5月15日
    00
  • CommunityToolkit.Mvvm8.1 MVVM工具包安装引用指南(1)

      本系列文章导航 https://www.cnblogs.com/aierong/category/2297596.html     0.说明 CommunityToolkit.Mvvm包(又名MVVM 工具包,以前名为 Microsoft.Toolkit.Mvvm)是一个现代、快速且模块化的 MVVM 库。它支持:.NET Standard 2.0、 .…

    C# 2023年4月18日
    00
  • asp.net core MVC 全局过滤器之ExceptionFilter过滤器(1)

    asp.net core MVC 全局过滤器之ExceptionFilter过滤器(1) 在ASP.NET Core MVC中,我们可以使用全局过滤器来处理应用程序中的异常。其中,ExceptionFilter过滤器是一种常用的全局过滤器,用于处理应用程序中的异常。在本文中,我们将详细讲解ExceptionFilter过滤器的使用方法。 ExceptionF…

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