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

相关文章

  • 合金装备5幻痛称号怎么获得_全称号获得方法推荐

    合金装备5幻痛称号获得攻略 在合金装备5幻痛中,称号是一种特殊的奖励,可以展示玩家的游戏成就。本文将详细介绍获得所有称号的方法。 常规称号 战场回忆录 通过游玩战斗任务,在任务结果页面查看回放,即可获得此称号。 示例:完成第一章任务后,通过回放观看第一章的任务结果页面,获得“战场回忆录”称号。 战斗关照 在与敌人战斗时,保护同伴3次以上即可获得此称号。 示例…

    C# 2023年6月6日
    00
  • C#基础学习系列之Attribute和反射详解

    C#基础学习系列之Attribute和反射详解 什么是 Attribute 和反射 Attribute 也称为特性,在 C# 中起到了一种将元数据与预定义元素进行关联的机制。反射可以让程序在运行时通过查看类型信息,调用对象的方法,或访问属性和字段。 Attribute 的用途 Attribute 主要用在以下场景: 提供给编译器或开发工具使用的注释 在运行时…

    C# 2023年5月31日
    00
  • 从C#程序中调用非受管DLLs的方法

    从C#程序中调用非托管 DLLs 的方法可以使用 P/Invoke,其作用是在 C# 代码中声明非托管函数并在 C# 中调用它们。 以下是从 C# 中调用非托管 DLL 的完整攻略: 步骤一:找到非托管 DLL,并获取该 DLL 中包含的函数及其参数。 通常,在VS中打开非托管 DLL 时,可以在 “Object Browser” 中查看 DLL 中导出的函…

    C# 2023年6月7日
    00
  • c# 单例模式的实现方法

    C#中的单例模式是面向对象编程中比较常用的模式,它可以确保一个类在整个系统中仅有一个实例,并且提供全局访问点。下面是单例模式的实现方法的完整攻略。 单例模式的实现方法 在C#中实现单例模式的一般步骤包括: 实现一个静态私有变量来保存该类的唯一实例。 实现一个公共的静态方法作为访问该类唯一实例的入口。 具体实现方法分为以下几个步骤: 步骤1:定义单例类 pub…

    C# 2023年6月6日
    00
  • JavaScript 2018 中即将迎来的新功能

    下面是对于JavaScript 2018即将迎来的新功能的详细讲解攻略。 异步迭代器 异步迭代器是 JavaScript 2018 中新增的一个比较重要的功能,这一功能可以让 Web 开发变得更加简单和高效,它的特点是可以同时迭代多个异步对象,实现对它们的并发处理。在之前的版本中,迭代器只支持同步迭代,异步操作如果要迭代需要使用 Generator 或回调函…

    C# 2023年6月8日
    00
  • C# WinForm-Timer控件的使用

    C# WinForm-Timer控件的使用攻略 1. 什么是Timer控件 在C# WinForm应用程序中,Timer控件主要用于定时器的功能,并可触发启用与禁用定时器事件。Timer控件是一种精准计时器,可在指定时间间隔后执行特定的事件或操作,并且在许多情况下都是非常有用的。 使用该控件,开发人员可以实现很多定时器应用,例如:倒计时、轮询数据库等等。 2…

    C# 2023年5月14日
    00
  • c#委托与事件(详解)

    C#委托与事件(详解) 什么是委托? 在C#中,委托是一个类,用于指向和调用一个或多个方法。可以将委托看做是方法的类型。通过委托,我们可以在运行时确定要调用哪个方法,而无需提前确定调用哪个方法。 如何定义委托? 在C#中,委托的定义非常简单,只需使用delegate关键字即可。 delegate 返回类型 委托名称(参数列表); 其中, 返回类型:委托指向方…

    C# 2023年6月1日
    00
  • C#使用Post调用接口并传递json参数

    下面是关于“C#使用Post调用接口并传递json参数”的完整攻略: 1. 确定请求地址和请求方式 使用Post调用接口需要确定请求地址和请求方式。通常情况下,请求地址是指接口的URL,请求方式是指HTTP请求的方式,即”GET”或”POST”。 2. 导入必要的命名空间 在进行Post调用接口时,需要导入以下两个命名空间: using System.Net…

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