c#实现多线程局域网聊天系统

C#实现多线程局域网聊天系统攻略

前言

本文介绍如何使用C#语言编写多线程局域网聊天系统。局域网聊天系统主要用于小范围内的通信,可以在公司、学校或家庭之间使用。使用多线程技术可以提升系统的并发性能,增强用户体验。本文将使用Visual Studio开发工具来进行程序设计和实现。

程序设计

整体架构

  1. 客户端程序:用于与其他用户进行通信和交流,需要与服务器程序进行通信才能实现聊天。
  2. 服务器程序:用于处理客户端程序的请求和数据,主要职责为消息转发和数据处理,保证系统并发性能和数据的完整性。

程序实现

下面将详细介绍如何实现客户端程序和服务器程序。

客户端程序

客户端程序需要完成以下几个功能:

  1. 登录服务器:通过输入IP地址或域名登录到局域网聊天室。
  2. 发送消息:将消息发送给其他在线用户。
  3. 接收消息:接收其他用户发送的消息,实现即时通讯的效果。
  4. 退出系统:用户退出系统时需要向服务器发送退出消息,以便服务器更新用户状态。

以下是示例代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;

public class Client {
    private TcpClient client;
    private NetworkStream stream;
    private Thread thread;

    public Client(string serverIP, int serverPort) {
        client = new TcpClient(serverIP, serverPort);

        stream = client.GetStream();

        thread = new Thread(new ThreadStart(DoWork));
        thread.Start();
    }

    private void DoWork() {
        Console.WriteLine("Connected to chat room server!");

        while (true) {
            byte[] buffer = new byte[1024];
            int len = stream.Read(buffer, 0, buffer.Length);
            string message = Encoding.UTF8.GetString(buffer, 0, len);

            Console.WriteLine("Received message: " + message);
        }
    }

    public void SendMessage(string message) {
        byte[] buffer = Encoding.UTF8.GetBytes(message);
        stream.Write(buffer, 0, buffer.Length);
    }

    public void Close() {
        thread.Abort();
        stream.Close();
        client.Close();
    }
}

服务器程序

服务器程序需要完成以下几个功能:

  1. 监听端口:监听指定的端口,等待客户端连接。
  2. 处理客户端请求:处理客户端发送的请求,包括登录、发送消息和退出系统。
  3. 转发消息:将客户端发送的消息转发给其他在线用户。
  4. 保持服务:持续为客户端提供服务,保证系统的可用性和并发性能。

以下是示例代码:

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

public class Server {
    private TcpListener listener;
    private Dictionary<string, TcpClient> clients;
    private Thread thread;

    public Server(int port) {
        listener = new TcpListener(IPAddress.Any, port);

        clients = new Dictionary<string, TcpClient>();

        thread = new Thread(new ThreadStart(DoWork));
        thread.Start();
    }

    private void DoWork() {
        listener.Start();

        Console.WriteLine("Chat room server was started!");

        while (true) {
            TcpClient client = listener.AcceptTcpClient();
            Thread thread = new Thread(new ParameterizedThreadStart(HandleClient));
            thread.Start(client);
        }
    }

    private void HandleClient(object obj) {
        TcpClient client = obj as TcpClient;

        string ip = ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString();
        clients.Add(ip, client);
        Console.WriteLine(ip + " joined the chat room!");

        NetworkStream stream = client.GetStream();

        while (true) {
            byte[] buffer = new byte[1024];
            int len = stream.Read(buffer, 0, buffer.Length);
            string message = Encoding.UTF8.GetString(buffer, 0, len);

            Console.WriteLine(ip + " sent a message: " + message);
            Broadcast(ip, message);
        }
    }

    private void Broadcast(string ip, string message) {
        foreach (var item in clients) {
            if (item.Key != ip) {
                TcpClient client = item.Value;
                NetworkStream stream = client.GetStream();

                byte[] buffer = Encoding.UTF8.GetBytes(message);
                stream.Write(buffer, 0, buffer.Length);
            }
        }
    }

    public void Close() {
        thread.Abort();
        listener.Stop();
    }
}

总结

本文介绍了使用C#语言实现多线程局域网聊天系统的攻略,主要分为客户端程序和服务器程序两个部分。通过本文所列示的代码,可以在Visual Studio中编写代码,快速搭建出一个简单的局域网聊天系统。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#实现多线程局域网聊天系统 - Python技术站

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

相关文章

  • C# BitArray(点矩阵)转换成int和string的方法实现

    首先,我们需要了解什么是BitArray(点矩阵)。BitArray 是C#中的一个类,这个类被设计用来存储布尔类型的数组。在实际使用中,经常可以用BitArray 来存储二进制数据,特别是在图像、声音压缩、加密解密、编码解码等处理中。 在C#中,我们有两种方法将BitArray转换为int类型和string类型。 将BitArray转换为int类型 第一种…

    C# 2023年6月7日
    00
  • c#转换全角半角方法示例

    当我们需要对用户输入的字符或文本进行处理时,经常需要将全角字符转换为半角字符或者将半角字符转换为全角字符。c#中提供了相应的方法来实现这些功能。下面是一个完整的示例说明“c#转换全角半角方法”的攻略。 1. 转换全角到半角 使用 System.Text.RegularExpressions.Regex 类的 Replace 方法可以实现将全角字符转换为半角字…

    C# 2023年6月8日
    00
  • 写一个Python脚本下载哔哩哔哩舞蹈区的所有视频

    要编写一个Python脚本下载哔哩哔哩舞蹈区的所有视频,可以按照以下步骤进行: 分析哔哩哔哩舞蹈区的网页结构,找到视频的URL和相关信息。 使用Python的requests库发送HTTP请求,获取哔哩哔哩舞蹈区的网页内容。 使用Python的BeautifulSoup库解析HTML,提取视频的URL和相关信息。 使用Python的urllib库下载视频。 …

    C# 2023年5月15日
    00
  • C# DirectoryInfo.GetFiles – 获取目录下的所有文件信息

    DirectoryInfo.GetFiles() 方法是C#文件操作中用于获取目录中所有文件的方法之一。该方法可以返回当前 DirectoryInfo 的所有文件(包括子目录中的文件),并且可以使用模式进行过滤。 DirectoryInfo.GetFiles() 方法返回一个 FileInfo 数组,其中每个文件都表示找到的文件。可以使用 FileInfo …

    C# 2023年4月19日
    00
  • .NET core项目AsyncLocal在链路追踪中的应用

    .NET Core 项目 AsyncLocal 在链路追踪中的应用 在 .NET Core 项目中,AsyncLocal 是一个非常有用的工具,它可以帮助我们在异步调用链路中传递上下文信息。本攻略将详细介绍如何在 .NET Core 项目中使用 AsyncLocal 实现链路追踪。 AsyncLocal 的作用 在 .NET Core 项目中,AsyncLo…

    C# 2023年5月16日
    00
  • 总结C#删除字符串数组中空字符串的几种方法

    我来详细讲解一下”总结C#删除字符串数组中空字符串的几种方法”的完整攻略,具体步骤如下: 问题描述 在C#中,有时候我们需要删除字符串数组中的空字符串,以便得到有效的数据。那么我们就需要了解如何使用C#来删除字符串数组中的空字符串。 解决方案 本文将总结出几种实现字符串数组中删除空字符串的方法,并给出代码示例。 方法一:使用Linq的Where方法 我们可以…

    C# 2023年6月7日
    00
  • C# Path.GetFileName – 获取路径中的文件名部分

    Path.GetFileName 方法是 .NET Framework 中提供的一个用于获取路径中文件名的静态方法,主要用于从路径中获取文件名,也可用于处理文件路径字符串,它位于 System.IO 命名空间中。 以下是该方法的作用: 获取给定路径字符串中的文件名。 通过计算要从中返回的位置的字符数,以及路径分隔符(注意:Windows 和 .NET 中的路…

    C# 2023年4月19日
    00
  • Android开源项目PullToRefresh下拉刷新功能详解2

    Android开源项目PullToRefresh下拉刷新功能详解2 概述 PullToRefresh是一款常见的Android开源下拉刷新库,它支持常见的ListView、GridView、ScrollView、WebView、ViewPager等控件的下拉刷新操作,使用简单方便,是Android开发者常用的开源库之一。 本文将主要讲解PullToRefre…

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