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# winForm自定义弹出页面效果

    C# WinForm自定义弹出页面效果可以通过以下步骤实现: 创建自定义页面样式 首先,我们需要创建一个自定义页面,可以用Visual Studio中的工具,如“新建WinForm应用程序”功能。该页面所有的控件均需要设置好。 创建完页面后,我们可以对其进行美化和样式优化,包括但不限于控件的位置、大小、颜色、字体等,以达到自定义弹出页面的效果。 创建模态窗口…

    C# 2023年6月6日
    00
  • C#使用NPOI读取excel转为DataSet

    让我来为你详细讲解“C#使用NPOI读取excel转为DataSet”的完整攻略。 什么是NPOI? NPOI是一款开源的适用于.NET和Java平台的POI开发包。POI是Apache Software Foundation的一个开源项目,其主要功能是对Microsoft Format Documents的解析和创建,比如Word、Excel、PowerP…

    C# 2023年5月15日
    00
  • C#异步执行任务的方法

    下面是使用C#异步执行任务的完整攻略,包含以下内容: 异步执行任务的基本概念及需要掌握的知识点 使用async/await关键字实现异步执行任务 使用Task.Run方法实现异步执行任务 两个实例来演示如何使用async/await和Task.Run异步执行任务 1. 异步执行任务的基本概念及需要掌握的知识点 在C#中,异步执行是指在程序继续执行其他操作的同…

    C# 2023年5月15日
    00
  • c#开发的程序安装时动态指定windows服务名称

    接下来我将详细讲解如何在C#开发的程序安装时动态指定Windows服务名称的完整攻略。具体来说,我们要在程序安装时动态指定Windows服务名称的关键在于(1)编写安装程序时获取服务名称,(2)在安装过程中指定服务名称。 获取服务名称 在编写安装程序时获取当前安装程序所安装的服务的名称是至关重要的,可以通过下面的方法实现: string serviceNam…

    C# 2023年6月1日
    00
  • C#中正则表达式(Regex)过滤内容的基本使用方法

    C#中正则表达式(Regex)是用于在字符串中查找并匹配特定文本模式的一种工具。这个工具在字符串处理中非常实用,可以用来验证输入的格式、从字符串中提取有用信息等等。 基本使用方法 C#中使用正则表达式需要引入命名空间System.Text.RegularExpressions,下面是一个基本的用法示例: using System.Text.RegularEx…

    C# 2023年6月8日
    00
  • ASP.NET Core基础之请求处理管道

    ASP.NET Core基础之请求处理管道 在 ASP.NET Core 中,请求处理管道是一个非常重要的组件,它负责处理 HTTP 请求并生成 HTTP 响应。本攻略将详细介绍 ASP.NET Core 的请求处理管道。 请求处理管道的作用 ASP.NET Core 的请求处理管道负责处理 HTTP 请求并生成 HTTP 响应。请求处理管道可以帮助我们: …

    C# 2023年5月16日
    00
  • AspNetCore 成长杂记(一):JWT授权鉴权之生成JWT(其一)

    引子 最近不知怎么的,自从学了WebAPI(为什么是这个,而不是MVC,还不是因为MVC的Razor语法比较难学,生态不如现有的Vue等框架,webapi很好的结合了前端生态)以后,使用别人的组件一帆风顺,但是不知其意,突然很想自己实现一个基于的JWT认证服务,来好好了解一下这个内容。 起步 自从Session-Cookie方案逐渐用的越来越少,JWT的使用…

    C# 2023年4月24日
    00
  • .net core利用PdfSharpCore操作PDF实例教程

    .NET Core利用PdfSharpCore操作PDF实例教程 简介 PdfSharpCore是一个.NET Core实现的PDF库,它提供基本的PDF操作,如创建、编辑和添加内容到PDF文件等。在本教程中,我们将使用PdfSharpCore来创建、编辑和保存PDF文件。 安装 我们通过NuGet安装PdfSharpCore。可以在Visual Studi…

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