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

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日

相关文章

  • win10和win7下java开发环境配置教程

    Win10和Win7下Java开发环境配置教程 本篇攻略主要介绍在Win10和Win7两个操作系统下,如何配置Java开发环境。本文所使用的Java版本是Java SE 8。 步骤1:下载Java SE 8 首先,我们需要下载最新版本的Java SE 8 JDK,下载地址为:https://www.oracle.com/technetwork/java/ja…

    other 2023年6月27日
    00
  • XPath常用定位节点元素语句总结

    XPath常用定位节点元素语句总结的完整攻略 XPath是一种用于在XML和HTML文档中定位节点的语言。在Web开发中,XPath常用于爬虫、自动化测试等场景。本文将详细讲解XPath常用定位节点元素语句的完整攻略,包括基本概念、语法规则、常用函数和两个示例说明。 基本概念 在XPath中,节点是文档中的基本元素。节点可以是元素、属性、文本、注释等。XPa…

    other 2023年5月5日
    00
  • Java 泛型 Generic机制实例详解

    Java 泛型 Generic机制实例详解 什么是Java泛型 Java泛型是指在实例化的时候,根据指定的类型参数来定义一种通用的数据类型,这样一来,在编码阶段就可以确定类型,并且能够在编译阶段对不合法类型的代码进行检查,保证程序的类型安全性。 泛型类 public class Box<T> { private T data; public Bo…

    other 2023年6月26日
    00
  • Win11右键菜单没反应 ?Win11更新后鼠标右键没反应解决教程

    Win11右键菜单没反应?Win11更新后鼠标右键没反应解决教程 如果你在使用Windows 11时,发现右键菜单没有任何反应,或者在更新Windows 11版本后,鼠标右键也出现了类似的问题,不要慌张,本文将为你提供详细的解决方案。 确认鼠标设置 首先需要确认一下鼠标设置是否出现了问题。在Windows 11中,右键菜单选项是依赖于鼠标设置的。如果鼠标设置…

    other 2023年6月27日
    00
  • 详解iOS自定义UITabBar与布局

    详解iOS自定义UITabBar与布局 简介 UITabBarController 是 iOS 开发中常用的视图控制器之一,它的作用是实现应用程序的 Tab 切换,便于用户进行主要功能模块的选择。然而,UITabBarController 的默认布局可能不符合我们的设计需求,这时我们可以使用自定义 UITabBar 来达到定制化效果。 本文将详细阐述 iOS…

    other 2023年6月25日
    00
  • IIS7.5提示无法写入配置文件web.config的解决方法

    问题描述: 当在IIS7.5的管理控制台中尝试更改Web站点的配置,或者在托管Web应用程序的IIS的Web服务器上运行的托管Web应用程序尝试将更改写入其Web.config文件时可能会出现以下错误消息: “不能写入配置文件web.config,请检查它是否已经锁定或只读。” 出现此错误消息是因为IIS 7.5使用了新的应用程序池身份验证模型,称为“托管服…

    other 2023年6月25日
    00
  • 详解Java Socket通信封装MIna框架

    详解Java Socket通信封装Mina框架 1. Java Socket通信介绍 Java Socket通信是一种网络通信方式,它是TCP/IP协议的一种实现。在Java中,Socket通信通常被用于构建客户端和服务器端应用程序。Java Socket通信可以使用Java中的Socket类和ServerSocket类来实现。 在Java Socket通信…

    other 2023年6月25日
    00
  • yum安装命令的使用方法

    Yum安装命令的使用方法 Yum是一种在Linux系统上用于管理软件包的工具。以下是使用Yum安装命令的详细步骤: 更新软件包列表 在执行安装命令之前,建议先更新软件包列表,以确保安装的软件包是最新的。使用以下命令更新软件包列表: shell sudo yum update 搜索软件包 如果你知道要安装的软件包的名称,可以使用以下命令搜索软件包: shell…

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