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日

相关文章

  • ASP.NET MVC前台动态添加文本框并在后台使用FormCollection接收值

    ASP.NET MVC是一种针对Web应用程序的Web框架,它支持使用C#或VB.NET编程语言来创建动态、响应性的Web应用程序。本文将详细介绍如何在ASP.NET MVC前台动态添加文本框并在后台使用FormCollection接收值的过程。 准备工作 在开始本文的教程之前,你需要进行以下准备工作: 首先,你需要安装Visual Studio 2017或…

    C# 2023年6月3日
    00
  • Asp.net core利用dynamic简化数据库访问

    Asp.net core利用dynamic简化数据库访问攻略 在本攻略中,我们将详细讲解如何使用dynamic简化Asp.net core中的数据库访问,并提供两个示例说明。 步骤一:安装Dapper Dapper是一个轻量级的ORM框架,可以帮助我们简化数据库访问。您可以使用NuGet包管理器或通过命令行运行以下命令来安装Dapper: Install-P…

    C# 2023年5月17日
    00
  • asp实现二进制字符串转换为Unicode字符串

    实现二进制字符串转换为Unicode字符串,可以通过以下步骤来完成: 将二进制字符串转换为byte数组。可以通过将二进制字符串每8位作为一个byte元素,将这些byte元素组成一个byte数组,来实现二进制字符串转换为byte数组。 示例1: 假设有以下二进制字符串:01100001011100100111001101110100 按照每8位作为一个byte…

    C# 2023年6月7日
    00
  • 解决navicat 链接oracle时出现的各种问题

    解决 Navicat 连接 Oracle 时出现的各种问题需要做以下几步: 1. 下载并安装 Oracle Instant Client 访问 Oracle 官网下载 Instant Client,需选择与你所使用操作系统相兼容的版本。下载的压缩包通常包含以下几个文件: instantclient-basiclite-linux.x64-xx.x.x.x.x…

    C# 2023年5月31日
    00
  • unity3D实现三维物体跟随鼠标

    下面我将详细讲解“unity3D实现三维物体跟随鼠标”的完整攻略。这个过程可以分成四个步骤: 获取鼠标在屏幕上的位置 将屏幕上的坐标转为三维坐标 使物体跟随鼠标移动 处理物体朝向 接下来我将详细讲解每一个步骤。 获取鼠标在屏幕上的位置 首先,我们需要获取鼠标在屏幕上的位置。这可以通过Unity提供的Input.mousePosition方法来获取。这个方法返…

    C# 2023年6月3日
    00
  • C# 如何实现一个基于值相等性比较的字典

    实现一个基于值相等性比较的字典需要满足两个条件: 能够将自定义类型作为字典中的键; 能够通过自定义类型的值相等性判断两个键是否相等。 下面将介绍如何使用 C# 实现这两个条件: 第一步:让自定义类型实现 IEquatable 接口 我们需要通过重写 Equals 方法来实现这一点。示例如下: public class MyClass : IEquatable…

    C# 2023年5月31日
    00
  • 详解ASP.NET Core中配置监听URLs的五种方式

    详解ASP.NET Core中配置监听URLs的五种方式 在ASP.NET Core应用程序中,可以通过配置监听URLs来指定应用程序监听的URL地址。本攻略将详细介绍ASP.NET Core中配置监听URLs的五种方式。 方式一:通过appsettings.json文件配置 可以通过在appsettings.json文件中添加以下代码来配置监听URLs: …

    C# 2023年5月16日
    00
  • C#图片处理3种高级应用

    C#图片处理3种高级应用 本文介绍了C#图片处理的3种高级应用方法,包括: 图片压缩 图片水印 图片格式转换 图片压缩 图片压缩是指通过对图片的色彩深度、分辨率、文件格式等进行调整来缩小图片文件的大小。下面通过示例代码说明如何利用C#进行图片压缩。 示例代码 using System.Drawing; using System.Drawing.Imaging…

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