基于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日

相关文章

  • ASP.NET MVC中使用log4net的实现示例

    下面是ASP.NET MVC中使用log4net的实现示例的完整攻略。 准备工作 首先,我们需要在ASP.NET MVC项目中安装log4net包。在Visual Studio中,可以通过NuGet Package Manager来安装: 打开Visual Studio; 打开ASP.NET MVC项目; 在Solution Explorer中右键单击项目名…

    C# 2023年5月31日
    00
  • C#使用TimeSpan时间计算的简单实现

    这里是关于C#使用TimeSpan时间计算的简单实现的详细攻略。 1. 安装和引用TimeSpan类库 首先需要在项目中添加using System;,以便使用TimeSpan类。在命名空间调用后,就可以开始用TimeSpan计算时间了。 2. 定义时间 你可以使用TimeSpan构造函数来定义时间,以获取所需的小时、分钟和秒。 TimeSpan ts = …

    C# 2023年6月1日
    00
  • C#使用Task.ContinueWith组合任务

    C#中的Task.ContinueWith()方法可以让我们更加灵活地组合多个任务。本篇攻略将详细介绍如何使用Task.ContinueWith()方法来组合任务。 一、Task.ContinueWith()方法的基本使用方法 Task.ContinueWith()方法允许我们在任务完成后继续执行一些操作。基本使用方法如下: Task task1 = Tas…

    C# 2023年6月6日
    00
  • LZW数据压缩算法的原理分析

    LZW数据压缩算法是一种基于字典的数据压缩算法,它通过构建字典来实现对输入数据的压缩。其主要流程如下: 1.初始化:先将所有单个字符加入字典中。 2.构建字典:从输入数据中读取第一个字符,然后依次读取字符直到在字典中找不到该字符串。将这个字符串(除最后一个字符)在字典中的下标输出并加入字典中,然后从下一个字符重新开始读取。 3.压缩:每次从输入数据中读取一个…

    C# 2023年6月7日
    00
  • C#实现老板键功能的代码

    当我们在使用电脑的时候,有时会有别人突然进入房间或者需要临时离开,这个时候我们需要有一个快捷的方式来隐藏当前程序或窗口,以避免别人看到我们的操作内容,这就是所谓的“老板键功能”。下面我来为大家介绍如何使用C#来实现老板键功能的代码。 1. 原理 老板键功能的实现原理是通过监听操作系统的键盘事件,当监听到我们设定的快捷键时,就会触发我们的代码来执行指定的操作,…

    C# 2023年5月31日
    00
  • C#中Dispose和Finalize方法使用介绍

    C#中Dispose和Finalize方法使用介绍 在C#中,Dispose方法和Finalize方法都是用于释放对象资源的方法,但它们的使用方式和时机不同,需要开发者熟练掌握。 Dispose方法 定义 Dispose方法是实现了IDisposable接口的类的一个方法,用于释放该类占用的非托管资源和托管资源。该方法为手动释放资源的一种方式,可以通过调用该…

    C# 2023年6月7日
    00
  • C# WinForm国际化实现的简单方法

    那么下面我来详细讲解一下“C# WinForm国际化实现的简单方法”。 什么是国际化 国际化(Internationalization),简称I18N,指将软件(尤其是在开发过程中)设计成可同时支持多种语言和字符集的技术。通俗点说,国际化就是将我们的程序在不同地区、不同语言下也能够顺利运行,显示相应的语言文本和界面信息。 WinForm国际化实现的简单方法 …

    C# 2023年6月6日
    00
  • ASP.NET Core利用Jaeger实现分布式追踪详解

    在本攻略中,我们将详细讲解如何在ASP.NET Core中利用Jaeger实现分布式追踪,并提供两个示例说明。 安装Jaeger:首先,我们需要安装Jaeger。我们可以从官方网站下载Jaeger,并按照官方文档进行安装和配置。 安装Jaeger.Client:接下来,我们需要安装Jaeger.Client NuGet包。我们可以使用Visual Studi…

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