c#多线程网络聊天程序代码分享(服务器端和客户端)

C#多线程网络聊天程序代码分享(服务器端和客户端)

介绍

本文所分享的是使用C#编写的多线程网络聊天程序的源代码,包括服务器端和客户端代码。网络聊天程序可以实现在不同计算机之间进行即时聊天的功能,多线程可以提升程序的并发性和性能,同时使用C#编写可以大大简化代码编写过程。

实现流程

  1. 服务器端程序编写

服务器端程序的主要作用是接受用户请求,并与客户端进行通讯。以下是服务器端代码的主要实现过程:

  • 创建Socket对象,并指定所使用的协议和通信类型。
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  • 绑定IP地址和端口号,即指定服务器端进行监听的网络地址。
IPEndPoint serverIpEndPoint = new IPEndPoint(IPAddress.Parse("服务器IP地址"), 8888);
serverSocket.Bind(serverIpEndPoint);
  • 开始监听客户端连接请求。
serverSocket.Listen(5);
  • 使用无限循环进行接收客户端请求,并在有客户端接入时创建一个新的线程进行处理。
while (true)
{
    Socket clientSocket = serverSocket.Accept();
    //使用新线程处理客户端请求
    Thread thread = new Thread(ClientThreadProc);
    thread.Start(clientSocket);
}
  • 在新线程中处理客户端的请求,包括接收客户端的消息和向客户端发送消息。
private void ClientThreadProc(object param)
{
    Socket clientSocket = (Socket)param;
    //接收来自客户端的消息
    byte[] buffer = new byte[1024 * 1024];
    int count = clientSocket.Receive(buffer);
    string msg = Encoding.UTF8.GetString(buffer, 0, count);
    //向客户端发送消息
    clientSocket.Send(Encoding.UTF8.GetBytes("收到了你的消息:" + msg));
    clientSocket.Close();
}
  1. 客户端程序编写

客户端程序的主要作用是与服务器端进行通讯,并向服务器端发送消息。以下是客户端代码的主要实现过程:

  • 创建Socket对象,并连接到服务器端。
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint serverIpEndPoint = new IPEndPoint(IPAddress.Parse("服务器IP地址"), 8888);
clientSocket.Connect(serverIpEndPoint);
  • 向服务器端发送消息。
string msg = "你好,服务器!";
clientSocket.Send(Encoding.UTF8.GetBytes(msg));
  • 接收来自服务器端的消息。
byte[] buffer = new byte[1024 * 1024];
int count = clientSocket.Receive(buffer);
string msg = Encoding.UTF8.GetString(buffer, 0, count);
  • 关闭Socket对象。
clientSocket.Close();

示例说明

以下是基于上述代码实现的多线程网络聊天程序的两个示例说明。

示例1:单一服务器

假设有1台服务器和2个客户端,可以使用以下代码实现多线程网络聊天:

  • 服务器端代码:
public class Server
{
    private Socket serverSocket;

    public void Start()
    {
        serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint serverIpEndPoint = new IPEndPoint(IPAddress.Parse("服务器IP地址"), 8888);
        serverSocket.Bind(serverIpEndPoint);
        serverSocket.Listen(5);

        while (true)
        {
            Socket clientSocket = serverSocket.Accept();
            Thread thread = new Thread(ClientThreadProc);
            thread.Start(clientSocket);
        }
    }

    private void ClientThreadProc(object param)
    {
        Socket clientSocket = (Socket)param;
        byte[] buffer = new byte[1024 * 1024];
        int count = clientSocket.Receive(buffer);
        string msg = Encoding.UTF8.GetString(buffer, 0, count);
        Console.WriteLine("服务器接收到来自客户端的消息:" + msg);
        clientSocket.Send(Encoding.UTF8.GetBytes("服务器已收到你的消息:" + msg));
        clientSocket.Close();
    }
}
  • 客户端代码:
public class Client
{
    private Socket clientSocket;

    public void SendMessage(string msg)
    {
        clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint serverIpEndPoint = new IPEndPoint(IPAddress.Parse("服务器IP地址"), 8888);
        clientSocket.Connect(serverIpEndPoint);
        clientSocket.Send(Encoding.UTF8.GetBytes(msg));

        byte[] buffer = new byte[1024 * 1024];
        int count = clientSocket.Receive(buffer);
        string responseMsg = Encoding.UTF8.GetString(buffer, 0, count);
        Console.WriteLine("客户端接收到来自服务器的消息:" + responseMsg);

        clientSocket.Close();
    }
}
  • 测试代码:
static void Main(string[] args)
{
    Server server = new Server();
    new Thread(server.Start).Start();

    Client client1 = new Client();
    new Thread(() => client1.SendMessage("你好,服务器!")).Start();

    Client client2 = new Client();
    new Thread(() => client2.SendMessage("来自客户端2的消息!")).Start();

    Console.ReadLine();
}

执行以上代码后,在服务器端的控制台输出如下:

服务器接收到来自客户端的消息:你好,服务器!
服务器接收到来自客户端的消息:来自客户端2的消息!

客户端1的控制台输出如下:

客户端接收到来自服务器的消息:服务器已收到你的消息:你好,服务器!

客户端2的控制台输出如下:

客户端接收到来自服务器的消息:服务器已收到你的消息:来自客户端2的消息!

可以看出,客户端发送的消息已经被服务器端接收,并向每个客户端发送响应消息。

示例2:多服务器

假设有2台服务器和2个客户端,可以使用以下代码实现多线程网络聊天:

  • 服务器1代码:
public class Server1
{
    private Socket serverSocket;

    public void Start()
    {            
        serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint serverIpEndPoint = new IPEndPoint(IPAddress.Parse("服务器1IP地址"), 8888);
        serverSocket.Bind(serverIpEndPoint);
        serverSocket.Listen(5);

        while (true)
        {
            Socket clientSocket = serverSocket.Accept();
            Thread thread = new Thread(() => ClientThreadProc1(clientSocket));
            thread.Start();
        }
    }

    private void ClientThreadProc1(Socket clientSocket)
    {
        byte[] buffer = new byte[1024 * 1024];
        int count = clientSocket.Receive(buffer);
        string msg = Encoding.UTF8.GetString(buffer, 0, count);
        Console.WriteLine("服务器1接收到来自客户端的消息:" + msg);

        Socket server2Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint server2IpEndPoint = new IPEndPoint(IPAddress.Parse("服务器2IP地址"), 8889);
        server2Socket.Connect(server2IpEndPoint);

        server2Socket.Send(Encoding.UTF8.GetBytes(msg));
        buffer = new byte[1024 * 1024];
        count = server2Socket.Receive(buffer);
        string responseMsg = Encoding.UTF8.GetString(buffer, 0, count);
        Console.WriteLine("服务器1接收到来自服务器2的响应消息:" + responseMsg);

        server2Socket.Close();
        clientSocket.Send(Encoding.UTF8.GetBytes(responseMsg));
        clientSocket.Close();
    }
}
  • 服务器2代码:
public class Server2
{
    private Socket serverSocket;

    public void Start()
    {
        serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint serverIpEndPoint = new IPEndPoint(IPAddress.Parse("服务器2IP地址"), 8889);
        serverSocket.Bind(serverIpEndPoint);
        serverSocket.Listen(5);

        while (true)
        {
            Socket clientSocket = serverSocket.Accept();
            Thread thread = new Thread(() => ClientThreadProc2(clientSocket));
            thread.Start();
        }
    }

    private void ClientThreadProc2(Socket clientSocket)
    {
        byte[] buffer = new byte[1024 * 1024];
        int count = clientSocket.Receive(buffer);
        string msg = Encoding.UTF8.GetString(buffer, 0, count);
        Console.WriteLine("服务器2接收到来自服务器1的消息:" + msg);
        clientSocket.Send(Encoding.UTF8.GetBytes("服务器2已收到你的消息:" + msg));
        clientSocket.Close();
    }
}
  • 客户端代码:
public class Client
{
    private Socket clientSocket;

    public void SendMessage(string msg)
    {
        clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint server1IpEndPoint = new IPEndPoint(IPAddress.Parse("服务器1IP地址"), 8888);
        clientSocket.Connect(server1IpEndPoint);
        clientSocket.Send(Encoding.UTF8.GetBytes(msg));

        byte[] buffer = new byte[1024 * 1024];
        int count = clientSocket.Receive(buffer);
        string responseMsg = Encoding.UTF8.GetString(buffer, 0, count);
        Console.WriteLine("客户端接收到来自服务器的消息:" + responseMsg);

        clientSocket.Close();
    }
}
  • 测试代码:
static void Main(string[] args)
{
    Server1 server1 = new Server1();
    new Thread(server1.Start).Start();

    Server2 server2 = new Server2();
    new Thread(server2.Start).Start();

    Client client1 = new Client();
    new Thread(() => client1.SendMessage("来自客户端1的消息!")).Start();

    Client client2 = new Client();
    new Thread(() => client2.SendMessage("来自客户端2的消息!")).Start();

    Console.ReadLine();
}

执行以上代码后,在服务器1的控制台输出如下:

服务器1接收到来自客户端的消息:来自客户端1的消息!
服务器1接收到来自服务器2的响应消息:服务器2已收到你的消息:来自客户端1的消息!

在服务器2的控制台输出如下:

服务器2接收到来自服务器1的消息:来自客户端1的消息!

客户端1的控制台输出如下:

客户端接收到来自服务器的消息:服务器2已收到你的消息:来自客户端1的消息!

客户端2的控制台输出如下:

客户端接收到来自服务器的消息:服务器2已收到你的消息:来自客户端2的消息!

可以看出,客户端发送的消息经过服务器1转发到服务器2,并返回响应消息。同时,服务器1和服务器2也可以进行相互之间的通讯。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#多线程网络聊天程序代码分享(服务器端和客户端) - Python技术站

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

相关文章

  • C#实现虚拟键盘的实例详解

    C#实现虚拟键盘的实例详解 介绍 C#可以使用Windows API实现虚拟键盘,可以在程序中模拟用户输入按键,适用于自动化测试、快捷键的实现等应用场景。 实现步骤 1. 引用Windows API库 在C#中,需要引用Windows API库来实现虚拟键盘功能。可以使用DllImport指令引入User32.dll库,该库包含了Windows API中的键…

    C# 2023年6月6日
    00
  • PHP学习笔记 IIS7下安装配置php环境

    PHP是一种流行的服务器端脚本语言,可以用于创建动态网站和Web应用程序。以下是在IIS7下安装配置PHP环境的完整攻略。 环境准备 在使用PHP前,需要在Windows服务器上安装IIS7。可以使用以下命令来安装IIS7: Install-WindowsFeature Web-Server -IncludeManagementTools 安装配置PHP环境…

    C# 2023年5月15日
    00
  • C#泛型编程介绍

    当我们在编写C#代码时,我们经常需要对不同的数据类型进行操作。通常我们要定义一个函数或类,用于处理某种数据类型,但是我们通常需要编写多个函数或类来处理不同的数据类型,这很繁琐而且重复。这时,泛型编程为我们提供了一种可重用的解决方案。在本文中,我们将介绍C#泛型编程的概念和使用方法,包括泛型类、泛型方法和泛型约束。 泛型类 泛型类是一种定义类的方式,类中的某些…

    C# 2023年5月15日
    00
  • c#压缩字符串的方法

    让我来详细讲解一下c#压缩字符串的方法的完整攻略。 为什么需要压缩字符串? 在实际开发中,传输数据是一个常见的需求。然而,如果数据过大,传输所需的时间和网络带宽都会增加,这对网站的性能会产生不良的影响。为了解决这个问题,压缩字符串是一个好的选择。压缩后的字符串文件体积会变小,传输时所需的时间和带宽也会变小。 c#字符串压缩的方法 1. 使用GZipStrea…

    C# 2023年5月31日
    00
  • C#中Html.RenderPartial与Html.RenderAction的区别分析

    下面是详细解释“C#中Html.RenderPartial与Html.RenderAction的区别分析”的完整攻略: 什么是Html.RenderPartial和Html.RenderAction? 两者都可以用于在视图中呈现另一个视图或控制器的操作。 Html.RenderPartial Html.RenderPartial可视为将一个视图作为另一个视图…

    C# 2023年5月31日
    00
  • C# DateTime.AddYears()方法: 将指定的年份数加到指定的日期上

    DateTime.AddYears()是C#中DateTime结构的一个方法,它用于增加指定的年数,并返回一个新的DateTime对象。它的使用方法如下: DateTime newDate = DateTime.Now.AddYears(2); 上述代码将获取当前时间,并增加2年,最后返回一个新的时间对象newDate。 可以使用AddYears()方法来计…

    C# 2023年4月19日
    00
  • C#中comboBox实现三级联动

    下面我来详细讲解C#中如何使用comboBox实现三级联动。 实现思路 三级联动是指在页面中有三级选项,当第一级选项发生变化时,第二级选项和第三级选项的内容会随之改变。在C#中,我们可以利用comboBox控件的SelectedIndexChanged事件和Add方法来实现三级联动。 首先,在设计表单时,我们需要创建三个comboBox控件,分别用来显示三级…

    C# 2023年6月1日
    00
  • asp.net中简体转繁体实现代码

    ASP.NET是微软推出的一种Web应用程序框架,支持多种编程语言和开发模式。其中,实现简体转繁体的方法有很多种,比如使用第三方开源库、使用.NET Framework自带的类库等。下面我将详细讲解一种较为简单的实现方法。 准备工作 在使用ASP.NET进行开发时,我们需要准备以下几项工作: 确认使用的开发环境,如Visual Studio等; 安装相应的.…

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