C#实现Socket服务器及多客户端连接的方式

yizhihongxing

C# 实现 Socket 服务器及多客户端连接的方式

在C#中,可以使用 Socket 类来实现网络编程。在这篇文章中,我将详细讲解如何使用C#实现Socket服务器及多客户端连接的方式。

什么是Socket?

Socket是一种用于在两个应用程序之间进行通信的技术。它使用IP地址和端口号来定义一个连接,并通过TCP或UDP来传输数据。

实现Socket服务器

要实现Socket服务器,您需要使用Socket类。下面是一个简单的示例,演示如何使用Socket类来创建一个简单的Socket服务器。

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

class Program
{
    static void Main(string[] args)
    {
        IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 1234);
        Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        listener.Bind(endPoint);
        listener.Listen(10);

        Console.WriteLine("服务器已启动,等待客户端连接...");

        while (true)
        {
            Socket handler = listener.Accept();
            Console.WriteLine($"客户端 {handler.RemoteEndPoint} 已连接。");

            byte[] bytes = new byte[1024];
            int bytesRec = handler.Receive(bytes);
            Console.WriteLine($"接收到来自客户端 {handler.RemoteEndPoint} 的消息:{Encoding.ASCII.GetString(bytes, 0, bytesRec)}");

            string response = "服务器收到了您的消息。\n";
            byte[] msg = Encoding.ASCII.GetBytes(response);
            handler.Send(msg);
            handler.Shutdown(SocketShutdown.Both);
            handler.Close();
        }
    }
}

在上面的示例中,我们首先创建一个IP地址为任意地址,端口号为1234的IPEndPoint。接下来,我们创建一个Socket对象,指定地址族为InterNetwork,协议类型为Tcp,套接字类型为Stream。我们将这个Socket对象绑定到IPEndPoint上,并开始侦听新的连接。在没有新的连接时,程序便会一直等待(阻塞状态)。

当有新的客户端连接时,我们创建了一个新的Socket对象来处理该客户端的请求。我们接收来自客户端的消息,并发送一个响应消息。在完成响应后,我们关闭这个Socket对象并继续等待新的连接。

实现多客户端连接

上面的示例中,我们只能与一个客户端连接。要实现多客户端连接,您需要使用MultiThread。

在多线程模式下,每个客户端连接都使用一个新线程来处理。如下是实现多客户端连接的示例代码:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
            IPAddress ipAddress = ipHostInfo.AddressList[0];
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);

            Console.WriteLine("服务器已启动,等待客户端连接...");

            Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            listener.Bind(localEndPoint);
            listener.Listen(100);

            while (true)
            {
                Socket clientSocket = listener.Accept();
                Console.WriteLine($"客户端 {clientSocket.RemoteEndPoint} 已连接。");

                Thread newThread = new Thread(new ParameterizedThreadStart(HandleClient));
                newThread.Start(clientSocket);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

    static void HandleClient(object obj)
    {
        Socket clientSocket = (Socket)obj;
        byte[] buffer = new byte[1024];
        string data = "";
        while (true)
        {
            int receivedBytes = clientSocket.Receive(buffer);
            data += Encoding.ASCII.GetString(buffer, 0, receivedBytes);
            if (data.EndsWith("<EOF>"))
                break;
        }

        Console.WriteLine($"客户端 {clientSocket.RemoteEndPoint} 发送消息:{data}");

        string response = "服务器收到了您的消息。\n";
        byte[] msg = Encoding.ASCII.GetBytes(response);
        clientSocket.Send(msg);

        clientSocket.Shutdown(SocketShutdown.Both);
        clientSocket.Close();
    }
}

在上面的示例代码中,我们启动一个线程来处理每个新连接。在HandleClient函数中,我们首先接收来自客户端的消息,并继续等待。在接收完整个消息之后,我们向客户端发送一个响应消息,并关闭这个Socket对象。

结论

在本文中,我们演示了如何使用C#实现Socket服务器及多客户端连接的方式。在您编写网络应用程序时,Socket技术可以提供灵活、可靠、高效的数据传输方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现Socket服务器及多客户端连接的方式 - Python技术站

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

相关文章

  • 魔兽世界wlk怀旧服敏锐贼堆什么属性 敏锐贼属性优先级选择攻略

    魔兽世界wlk怀旧服敏锐贼堆什么属性 简介 敏锐贼(通常指刺杀贼)在WotLK版本中以其高伤害和高爆发力而为人熟知,但是对于玩家来说,在敏锐贼在分配属性时,往往会有些困惑。本攻略将为敏锐贼的属性分配提供一些指导。 敏锐贼属性优先级选择攻略 1. 确定攻击速度 在了解敏锐贼的属性之前,我们需要首先确定相应的攻击速度。敏锐贼需要以突袭和毒药等使用技能为主的方式发…

    other 2023年6月27日
    00
  • sweetalert2全网最详细的使用方法

    以下是sweetalert2全网最详细的使用方法的完整攻略,包括以下内容: 概述 sweetalert2安装和配置 sweetalert2基本用法 sweetalert2高级用法 示例说明 1. 概述 sweetalert2是一款弹窗插件,可以用于在网页中显示各种弹窗效果。本文将介绍如何使用sweetalert2实现各种弹窗效果。 2. sweetalert…

    other 2023年5月9日
    00
  • python查看数据类型的方法

    Python 提供了很多方法来查看数据类型。下面是一些主要的方法: type() 函数 Python 的内置函数 type() 可以返回值的类型。 示例代码: a = 1 b = "hello" c = [1, 2, 3] d = {‘name’: ‘Tom’, ‘age’: 18} print(type(a)) # <class …

    other 2023年6月27日
    00
  • React Class组件生命周期及执行顺序

    React Class组件生命周期是React组件在挂载、更新和卸载时所执行的方法集合。这个过程中,React会自动调用这些方法,让我们更好地管理组件的状态和行为。这篇攻略将深入讲解React Class组件生命周期及其执行顺序,以及如何正确使用它们来构建可扩展的React应用程序。 什么是React Class组件生命周期 React Class组件生命周…

    other 2023年6月27日
    00
  • 虚幻4Matinee功能 基本概念及简单演示样例(Sequence编辑器)

    虚幻4Matinee功能 基本概念及简单演示样例(Sequence编辑器) 虚幻4(Unreal Engine 4)是一款由Epic Games开发的游戏引擎,其中的Matinee功能是让开发者更方便地创建电影场景和游戏场景的工具。 Matinee可以让开发者通过创建一个序列(Sequence),将不同的物体、声音和材质等组合在一起,形成一段特别流畅的动画效…

    其他 2023年3月28日
    00
  • 使用命令行安装驱动程序的方法

    当需要在计算机上使用特定的硬件设备时,我们需要先安装对应的驱动程序。通常情况下,我们可以通过驱动安装程序进行安装,但有时我们可能面对官网缺失或者版本不适配等问题,这时我们可以通过命令行进行安装。下面是使用命令行安装驱动程序的方法的详细攻略。 步骤一:下载并解压驱动文件 首先,需要在官网上下载对应硬件设备的驱动程序。将下载的文件解压缩到一个文件夹中,注意记下文…

    other 2023年6月26日
    00
  • 魔兽世界7.3.5冰法怎么堆属性 wow7.35冰法配装属性优先级攻略

    魔兽世界7.3.5冰法怎么堆属性攻略 魔兽世界的冰法职业在游戏中一直以高输出、高机动性、高生存力而闻名。正确的堆属性可以使冰法更加恐怖,本文将详细介绍wow7.35冰法配装属性优先级攻略。 恢复效益属性优先级 冰法职业在PVE中一般使用血量为全25000,攻击速度没有上限,同时需要考虑自己的魔法恢复效益(MP5),尤其是在长时间的战斗中。能够增加MP5的属性…

    other 2023年6月27日
    00
  • Nginx服务器的location指令匹配规则详解

    Nginx服务器的location指令匹配规则详解 Nginx是一款高性能的Web服务器和反向代理服务器,它使用location指令来匹配URL,并根据匹配结果执行相应的操作。在本攻略中,我们将详细讲解Nginx服务器的location指令的匹配规则。 1. 精确匹配 精确匹配是最基本的location匹配规则,它使用=操作符进行匹配。示例如下: locat…

    other 2023年8月18日
    00
合作推广
合作推广
分享本页
返回顶部