基于c#用Socket做一个局域网聊天工具

下面是如何基于C#使用Socket编写一个局域网聊天工具的完整攻略。

1. 确定聊天工具功能

在开发之前,我们需要明确自己需要实现哪些功能。一个基本的局域网聊天工具需要完成的功能有:连接、发送、接收、断开、修改昵称等操作。

2. 基本架构

想要实现局域网聊天工具,需要先了解Socket编程的基本原理。需要使用TcpListener和TcpClient来建立连接、发送和接收信息。其中,TcpListener负责监听端口,接收来自TcpClient的连接请求并为每个连接请求创建新的TcpClient;TcpClient则负责与TcpListener建立连接,并且负责发送和接收信息。

基于此,我们可以采用如下基本的程序架构:

  1. 建立Socket Server端,监听端口;
  2. 客户端Socket向Server端的IP和端口发送连接请求;
  3. Server端接收到客户端的连接请求后,为该连接请求创建一个新的TcpClient,并记录下该连接的信息(如客户端IP地址,所分配的端口号);
  4. 客户端和Server端通过TcpClient之间进行数据交换(如发送和接收聊天信息);
  5. 如果客户端或Server端断开了连接,则需要释放相应的资源。

3. 实现具体功能

3.1 建立Server端

首先,创建一个TcpListener对象,指定IP和监听端口,用于监听来自客户端的连接请求。在接收到连接请求后,需要为每个连接请求创建一个新的TcpClient,并将TcpClient对象存储在一个List中。为了防止线程的死锁,需要使用异步执行accept()方法的方式来接收连接请求。

TcpListener server = new TcpListener(IPAddress.Parse(serverIP), port);
server.Start();

while (true)
{
    TcpClient client = await server.AcceptTcpClientAsync();
    clients.Add(client);
}

3.2 建立Client端

客户端需要通过TcpClient对象与服务端建立连接。在连接成功之后,客户端需要向服务端发送消息,并等待服务端的回应。

TcpClient client = new TcpClient(serverIP, port);

while (true)
{
    string message = Console.ReadLine(); //从控制台读入信息

    //将消息转化为byte数组
    byte[] data = Encoding.UTF8.GetBytes(message);

    //发送
    client.GetStream().Write(data, 0, data.Length);
}

3.3 接收和发送信息

客户端和服务端可以通过TcpClient.GetStream()方法来进行数据交换。在接收信息时,需要使用StreamReader对象来读取TcpClient对象流中的信息,转换为字符串后进行进一步处理。

while (true)
{
    //获取TcpClient对象流中的字符串
    StreamReader reader = new StreamReader(client.GetStream());

    //如果从reader中读取到了数据
    if (reader.Peek() != -1)
    {
        string message = reader.ReadLine();
        Console.WriteLine(message); //将消息输出到控制台
    }
}

在发送信息时,需要将信息转化为byte数组,并使用TcpClient对象的Write()方法将信息发送至服务端。

while (true)
{
    string message = Console.ReadLine(); //从控制台读入信息

    //将消息转化为byte数组
    byte[] data = Encoding.UTF8.GetBytes(message);

    //发送
    client.GetStream().Write(data, 0, data.Length);
}

3.4 断开连接

在Socket编程中,需要手动释放所有已经创建的TcpClient对象,以保证资源的释放。关闭客户端或服务端时,需要先关闭其对应的TcpClient对象,并将该TcpClient对象从存储TcpClient对象的List中移除,最后再关闭TcpListener对象。

//关闭当前TcpClient
client.Close();

//在存储所有TcpClient的List中移除当前TcpClient
clients.Remove(client);

//关闭TcpListener
server.Stop();

4. 示例说明

4.1 示例1:搭建简单的服务端

class Program
{
    static List<TcpClient> clients = new List<TcpClient>(); //存储所有TcpClient的List

    //建立服务端
    static async Task Main(string[] args)
    {
        //指定服务端IP和端口号
        string serverIP = "127.0.0.1";
        int port = 8888;

        //创建TcpListener对象,用于监听来自客户端的连接请求
        TcpListener server = new TcpListener(IPAddress.Parse(serverIP), port);
        server.Start();

        Console.WriteLine("Server is running...");

        while (true)
        {
            //异步接收连接请求
            TcpClient client = await server.AcceptTcpClientAsync();

            //将客户端连接的TcpClient对象存储进clients List中
            clients.Add(client);

            //输出已连接客户端的IP地址和端口号
            Console.WriteLine("Connection accepted from " + client.Client.RemoteEndPoint.ToString());
        }
    }
}

4.2 示例2:连接客户端

class Program
{
    //建立客户端连接
    static async Task Main(string[] args)
    {
        //指定服务端IP和端口号
        string serverIP = "127.0.0.1";
        int port = 8888;

        Console.WriteLine("Connecting to server...");

        //创建TcpClient对象,连接服务端
        TcpClient client = new TcpClient(serverIP, port);

        Console.WriteLine("Connected to server.");

        while (true)
        {
            //从控制台读取信息
            string message = Console.ReadLine();

            //将信息转化为byte数组
            byte[] data = Encoding.UTF8.GetBytes(message);

            //发送信息
            client.GetStream().Write(data, 0, data.Length);
        }
    }
}

这两个示例只是局域网聊天工具的基础,可以在此基础上添加更多的功能,如修改昵称,发送文件等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于c#用Socket做一个局域网聊天工具 - Python技术站

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

相关文章

  • C# 两种方式反编译修改源码(dnspy,ildasm & ilasm)

    C#是一种流行的编程语言,许多开发人员在使用C#时需要反编译他人的代码或修改自己的代码。本文将介绍C#两种反编译修改源码的方式:dnspy和ildasm&ilasm,并提供两个示例。 用dnspy反编译和修改C#源码 dnspy是一款开源的.NET程序集反编译工具,可以轻松地反编译和修改C#程序集。以下是使用dnspy反编译和修改C#代码的步骤: 步…

    C# 2023年5月15日
    00
  • 聊聊C#中的Mixin的具体用法

    当我们在C#中需要实现多重继承时,Mixin就可以帮助我们实现这一目的。Mixin采用接口实现的方式,为类动态地添加属性和方法。 什么是Mixin? Mixin是一种代码复用技术,它通过动态给类增加属性和方法来解决多重继承的问题。在C#中,由于C#只能通过单一继承来实现代码复用,因此Mixin技术来弥补了C#的不足,实现了多重继承。 C#中Mixin的实现方…

    C# 2023年6月1日
    00
  • SQL Server 2008 安装SQLDMO.dll的方法

    首先需要明确的是,SQLDMO.dll是SQL Server的一个重要组件,许多应用程序需要它来连接和操作SQL Server数据库。在安装SQL Server 2008时,SQLDMO.dll并不是自动安装的,因此在使用一些依赖SQLDMO.dll组件的应用程序时,需要手动安装SQLDMO.dll。 下面是基本步骤: 1. 下载SQLDMO.dll文件 可…

    C# 2023年5月31日
    00
  • 关于dotnet 替换 ASP.NET Core 的底层通讯为命名管道的 IPC 库的问题

    dotnet替换ASP.NET Core的底层通讯为命名管道的IPC库 在ASP.NET Core中,我们可以使用Inter-Process Communication(IPC)来实现进程间通信。默认情况下,ASP.NET Core使用Socket作为底层通信机制。但是,我们也可以使用命名管道来替换Socket。在本攻略中,我们将介绍如何使用命名管道来替换S…

    C# 2023年5月16日
    00
  • 区分WCF与WebService的异同、优势

    区分WCF与WebService的异同、优势 WCF(Windows Communication Foundation)和WebService都是用于构建分布式应用程序的技术。它们都可以实现跨平台、跨语言的通信,但在实现方式、功能和性能等方面存在一些差异。本文将详细讲解WCF和WebService的异同、优势,并提供两个示例。 WCF与WebService的…

    C# 2023年5月15日
    00
  • ASP.NET中MultiView和View选项卡控件的使用方法

    当我们需要在ASP.NET中实现多页面功能时,常常使用一些选项卡控件。在ASP.NET中,使用MultiView和View选项卡控件可以非常方便地实现这个功能。下面我将详细讲解如何使用MultiView和View选项卡控件。 MultiView控件 MultiView控件是一个容器控件,它可以包含多个View控件,每个View控件相当于一个选项卡。在运行时,…

    C# 2023年5月31日
    00
  • vs2010怎么自定义的模板?

    下面是vs2010自定义模板的完整攻略: 1. 创建模板文件 VS2010中的模板都存放在指定的文件夹中,我们可以直接把自己编写的模板文件放在这个文件夹中。模板文件夹的位置是:C:\Users\用户名\Documents\Visual Studio 2010\Templates,进入文件夹后可以看到很多已有的模板。 我们可以在模板文件夹中创建一个新的文件夹,…

    C# 2023年6月6日
    00
  • C#使用Newtonsoft.Json中的JObject对象

    当我们需要在C#应用程序中处理JSON数据时,可以使用Newtonsoft.Json库。该库提供了许多用于处理JSON数据的类和方法,其中一个非常有用的类是JObject。 JObject类表示一个JSON对象,它的属性通常是一个或多个JToken对象。以下是使用JObject操作JSON数据的完整攻略。 步骤1:导入Newtonsoft.Json库 首先,…

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