基于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# 面向对象之类与对象

    浅谈C#面向对象之类与对象 在 C# 中,类与对象是面向对象程序设计 (OOP) 的核心概念。类是一个模板或者蓝图,用来描述某个对象的属性和方法。对象是类的一个实例,是具有一组属性和方法的实体。 定义类 C# 中定义类使用 class 关键字。类由类名、数据成员和成员函数组成。 例如: public class Person { // 数据成员 privat…

    C# 2023年6月1日
    00
  • C# WebService发布以及IIS发布

    C# Web Service 是一个旨在提供相互操作性的中间层组件,它使用SOAP协议(SimpleObject Access Protocol)。它可以被许多不同的应用程序使用,无论这些应用程序使用什么平台或语言。 在C#中,我们可以使用Visual Studio或手动编写代码来编写Web Service,本文将介绍C# Web Service的两种发布方…

    C# 2023年5月15日
    00
  • C#调用Win32的API函数–User32.dll

    下面我来详细讲解“C#调用Win32的API函数–User32.dll”的完整攻略。 什么是Win32 API Win32 API(Application Programming Interface),也叫Windows API,是Windows操作系统提供的一系列核心函数和接口,用于与操作系统打交道,访问系统资源、控制窗口和菜单等。Win32 API以动…

    C# 2023年6月7日
    00
  • C#中的IEnumerable简介及简单实现实例

    C#中的IEnumerable简介及简单实现实例 在 C# 中,IEnumerable 是一个常用的接口,它提供了一种遍历集合元素的方式。本文将介绍IEnumerable接口的概念和用法,并提供几个简单的实现实例。 什么是IEnumerable IEnumerable 是 C# 中的一个接口,它定义了一种用于枚举集合元素的标准协议。此接口有以下两个方法: p…

    C# 2023年6月1日
    00
  • C# ODP.NET 调用Oracle函数返回值时报错的一个解决方案

    下面是详细讲解“C#ODP.NET调用Oracle函数返回值时报错的一个解决方案”的完整攻略。 问题描述 在使用C#的ODP.NET连接Oracle数据库时,调用Oracle函数返回值时,往往会出现“Oracle.DataAccess.Client.OracleException: ORA-06502: PL/SQL: 数组或者记录数据类型必须具体化来解决这…

    C# 2023年5月15日
    00
  • VS2022使用ClickOnce发布程序本地安装.net框架

    因为遇到下面的错误,没有在网上搜到详细解决问题的教程,费了一些时间才解决了问题,特此记录一下,也希望能帮助到其他人。  要在“系统必备”对话框中启用“从与我的应用程序相同的位置下载系统必备组件”,必须将“.NET 桌面运行时 6.0.14 (x64)”项的文件“net6desktopruntime_x64\windowsdesktop-runtime-6.0…

    C# 2023年5月7日
    00
  • vs如何读取mysql中的数据并解决中文乱码问题

    读取MySQL中的数据并将其显示在Visual Studio(VS)中是一个常见的需求。在这个过程中,由于编码问题,可能出现中文乱码的情况,需要进行一些处理。下面是详细的攻略: 步骤一:安装MySQL连接器 要在VS中读取MySQL的数据,首先需要安装MySQL连接器。可以从MySQL官网上下载适合自己系统的MySQL连接器,下载链接为:https://de…

    C# 2023年5月31日
    00
  • C#获取所有进程的方法

    关于C#获取所有进程的方法,我们可以通过以下步骤进行实现。 1. 引用命名空间 我们需要在代码中添加System.Diagnostics命名空间,代码如下: using System.Diagnostics; 2. 获取所有进程 我们使用Process类中的静态方法GetProcesses()获取当前运行的所有进程,代码如下: Process[] proce…

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