C#语言的网络编程

news2025/1/9 21:46:10

C#语言的网络编程

网络编程是现代软件开发中不可或缺的一部分,尤其在当今互联网迅猛发展的时代。C#作为一种强类型、面向对象的编程语言,广泛应用于Windows应用程序、Web应用程序和服务的开发。本文将深入探讨C#语言的网络编程,包括基本概念、常用类库、实例代码以及在实际项目中的应用。

1. 网络编程概述

网络编程涉及到利用计算机网络进行数据通信和资源共享。它用于实现不同机之间的信息交换。网络编程的基本概念包括通信协议、网络架构、客户端与服务器模型等。

1.1 通信协议

网络通信协议是指一组规则和标准,用于确定计算机如何进行交流。常见的通信协议包括:

  • TCP/IP: 传输控制协议与因特网协议,是现代网络的基础。
  • HTTP/HTTPS: 超文本传输协议用于Web数据传输。
  • FTP: 文件传输协议,用于在网络上传输文件。

1.2 网络架构

在网络编程中,通常采用客户端-服务器模型。在这个模型中,客户端发送请求,服务器处理请求并返回响应。常见的网络架构有:

  • 单一服务器架构: 所有客户端连接到同一服务器。
  • 分布式架构: 多个服务器可分担负载。
  • 微服务架构: 将应用拆分成多个小服务,各自独立运行。

2. C#网络编程基础

在C#中,网络编程主要依赖于System.NetSystem.Net.Sockets命名空间。使用这些类,可以实现 TCP 和 UDP 的网络通信。

2.1 TCP协议编程

TCP(传输控制协议)是面向连接的协议,提供可靠的、顺序的和错误检查的数据传输。下面是一个简单的TCP服务器和客户端的示例。

TCP服务器代码示例

```csharp using System; using System.Net; using System.Net.Sockets; using System.Text;

class TcpServer { private const int port = 12345;

public static void Main()
{
    TcpListener server = new TcpListener(IPAddress.Any, port);
    server.Start();
    Console.WriteLine("服务器正在运行,等待连接...");

    while (true)
    {
        TcpClient client = server.AcceptTcpClient();
        Console.WriteLine("客户端已连接!");

        NetworkStream stream = client.GetStream();
        byte[] buffer = new byte[1024];
        int bytesRead = stream.Read(buffer, 0, buffer.Length);
        string message = Encoding.ASCII.GetString(buffer, 0, bytesRead);
        Console.WriteLine("收到消息: " + message);

        string response = "消息已收到";
        byte[] responseData = Encoding.ASCII.GetBytes(response);
        stream.Write(responseData, 0, responseData.Length);
        client.Close();
    }
}

} ```

TCP客户端代码示例

```csharp using System; using System.Net.Sockets; using System.Text;

class TcpClientExample { private const string serverIp = "127.0.0.1"; private const int port = 12345;

public static void Main()
{
    TcpClient client = new TcpClient(serverIp, port);
    NetworkStream stream = client.GetStream();

    string message = "Hello, Server!";
    byte[] data = Encoding.ASCII.GetBytes(message);
    stream.Write(data, 0, data.Length);
    Console.WriteLine("发送消息: " + message);

    byte[] buffer = new byte[1024];
    int bytesRead = stream.Read(buffer, 0, buffer.Length);
    string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);
    Console.WriteLine("收到响应: " + response);

    client.Close();
}

} ```

2.2 UDP协议编程

UDP(用户数据报协议)是无连接的,适用于实时应用,但不保证数据可靠性。下面是UDP服务器和客户端的代码示例。

UDP服务器代码示例

```csharp using System; using System.Net; using System.Net.Sockets; using System.Text;

class UdpServer { private const int port = 12345;

public static void Main()
{
    UdpClient udpServer = new UdpClient(port);
    Console.WriteLine("UDP服务器正在运行...");

    while (true)
    {
        IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, port);
        byte[] buffer = udpServer.Receive(ref remoteEP);
        string message = Encoding.ASCII.GetString(buffer);
        Console.WriteLine($"收到来自 {remoteEP.Address} 的消息: {message}");

        string response = "消息已收到";
        byte[] responseData = Encoding.ASCII.GetBytes(response);
        udpServer.Send(responseData, responseData.Length, remoteEP);
    }
}

} ```

UDP客户端代码示例

```csharp using System; using System.Net; using System.Net.Sockets; using System.Text;

class UdpClientExample { private const string serverIp = "127.0.0.1"; private const int port = 12345;

public static void Main()
{
    UdpClient udpClient = new UdpClient();
    udpClient.Connect(serverIp, port);

    string message = "Hello, UDP Server!";
    byte[] data = Encoding.ASCII.GetBytes(message);
    udpClient.Send(data, data.Length);
    Console.WriteLine("发送消息: " + message);

    IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, port);
    byte[] buffer = udpClient.Receive(ref remoteEP);
    string response = Encoding.ASCII.GetString(buffer);
    Console.WriteLine("收到响应: " + response);

    udpClient.Close();
}

} ```

3. C#网络编程中的常用类库

C#网络编程中,有几个常用的类库,有助于简化编程过程。

3.1 WebClient

WebClient类允许你发送和接收HTTP请求。它封装了一些常用的HTTP方法,如GET和POST。

```csharp using System; using System.Net;

class WebClientExample { public static void Main() { using (WebClient client = new WebClient()) { string url = "http://www.example.com"; string response = client.DownloadString(url); Console.WriteLine(response); } } } ```

3.2 HttpClient

HttpClient是更现代化的HTTP API,支持异步请求,更加灵活。

```csharp using System; using System.Net.Http; using System.Threading.Tasks;

class HttpClientExample { public static async Task Main() { using (HttpClient client = new HttpClient()) { string url = "http://www.example.com"; string response = await client.GetStringAsync(url); Console.WriteLine(response); } } } ```

4. C#网络编程的应用场景

4.1 Web应用程序

C#广泛用于开发Web应用程序,尤其是基于ASP.NET的应用。在Web应用中,HTTP协议扮演着重要角色。

4.2 客户端-服务器应用

无论是聊天应用、文件分享工具还是在线游戏,C#的网络编程能力都能满足需求。

4.3 数据爬虫

使用HttpClientHtmlAgilityPack等库,可以轻松实现网页抓取和数据提取。

4.4 IoT应用

C#同样适用于开发IoT(物联网)应用,通过TCP/IP或UDP来实现设备间的通信。

5. 示例项目

这里我们用C#创建一个简单的聊天程序示例,使用TCP协议,客户端能够连接到服务器,并发送消息。

5.1 聊天服务器

```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading;

class ChatServer { private static TcpListener listener; private static void Main() { listener = new TcpListener(IPAddress.Any, 12345); listener.Start(); Console.WriteLine("聊天室服务器正在启动...");

    while (true)
    {
        TcpClient client = listener.AcceptTcpClient();
        Console.WriteLine("有客户端连接!");
        Thread clientThread = new Thread(HandleClient);
        clientThread.Start(client);
    }
}

private static void HandleClient(TcpClient client)
{
    NetworkStream stream = client.GetStream();
    byte[] buffer = new byte[1024];
    int bytesRead;

    while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0)
    {
        string message = Encoding.ASCII.GetString(buffer, 0, bytesRead);
        Console.WriteLine($"收到消息: {message}");
        stream.Write(buffer, 0, bytesRead); // Echo back to client
    }

    client.Close();
}

} ```

5.2 聊天客户端

```csharp using System; using System.Net.Sockets; using System.Text; using System.Threading;

class ChatClient { private const string serverIp = "127.0.0.1"; private const int port = 12345;

public static void Main()
{
    TcpClient client = new TcpClient(serverIp, port);
    NetworkStream stream = client.GetStream();
    Thread readThread = new Thread(() =>
    {
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0)
        {
            string message = Encoding.ASCII.GetString(buffer, 0, bytesRead);
            Console.WriteLine($"服务器: {message}");
        }
    });
    readThread.Start();

    while (true)
    {
        string message = Console.ReadLine();
        byte[] data = Encoding.ASCII.GetBytes(message);
        stream.Write(data, 0, data.Length);
    }
}

} ```

6. 总结

C#的网络编程功能强大且灵活,可以满足多种应用场景的需求。从基础的TCP和UDP编程到高级的HTTP请求,C#都提供了良好的支持。掌握C#网络编程能够为开发现代互联网应用奠定基础。

在实际项目中,开发者可以根据业务需求选择合适的网络协议和架构。同时,不断学习和实践,将会使你的网络编程能力更上一层楼。希望本文能够帮助读者在C#网络编程的道路上走得更远。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2274022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW轴承性能测试系统

本文介绍了基于LabVIEW的高效轴承性能测试系统的设计与开发。系统通过双端驱动技术实现高精度同步控制,针对轴承性能进行全面的测试与分析,以提高轴承的可靠性和寿命。 项目背景 随着工业自动化程度的提高,对轴承的性能要求越来越高。传统的…

(k8s)Flannel Error问题解决!

1.问题描述 书接上回,我们在解决kubectl不断重启的时候引入了Flannel 网络插件,但是一上来就报错, 2.问题解决 自己的思路:照例开始检查 1.先检查一下目前Flannel的pod kubectl get pods --all-namespaces 2.检查 Flannel的po…

CatLog的使用

一 CatLog的简介 1.1 作用 CAT(Central Application Tracking) 是基于 Java 开发的实时应用监控平台,为美团点评提供了全面的实时监控告警服务。 1.2 组成部分 1.2.1 Transaction 1.Transaction 适合记录跨越系统边界的程序访问行为&a…

深入Android架构(从线程到AIDL)_18 SurfaceView的UI多线程02

目录 2、 使用SurfaceView画2D图 范例一 设计GameLoop(把小线程移出来) 范例二 2、 使用SurfaceView画2D图 范例一 以SurfaceView绘出Bitmap图像设计SpriteView类别来实作SurfaceHolder.Callback接口首先来看个简单的程序,显示出一个Bitmap图像。这个图像就构…

【FlutterDart】 拖动边界线改变列宽类似 vscode 那种拖动改变编辑框窗口大小(11 /100)

【Flutter&Dart】 拖动改变 widget 的窗口尺寸大小GestureDetector~简单实现(10 /100) 【Flutter&Dart】 拖动边界线改变列宽并且有边界高亮和鼠标效果(12 /100) 上效果: 这个在知乎里找到的效果&…

tk GMV MAX素材范围投放指南

Product GMy Max素材范围说明 Product GMy Max能自动获取带有相关商品锚点链接(无论是单个锚点还是多个锚点)的视频,并将其用于推广特定商品的广告素材,前提是这些视频已经获得广告授权。然而,请注意,多个…

物联网无线芯片模组方案,设备智能化交互升级,ESP32-C3控制应用

无线交互技术的核心在于实现设备之间的无缝连接和数据传输。在智能家居系统中,各种智能设备如智能灯泡、智能插座、智能门锁等,都通过无线网络相互连接,形成一个互联互通的生态。 用户可以通过语音助手、手机APP或其他智能终端,远…

ubuntu为Docker配置代理

终端代理 我们平常在ubuntu终端中使用curl或git命令时,往往会很慢。 所以,首先需要给ubuntu终端环境添加代理。 查看自身那个软件的端口号,我这里是7890。 sudo gedit ~/.bashrcexport http_proxyhttp://localhost:7890 export https_pr…

【VUE 指令学习笔记】

v-bind :单向绑定解析表达式,可简写为:xxx v-model :双向数据绑定。 v-for:遍历数组/对象/字符串 v-on:绑定事件监听,可简写为。 v-if:条件渲染(动态控制节点是否存存在) v-else:条件渲染(动态控制节点是否存存在) v-show:条件渲染…

用OpenCV实现UVC视频分屏

分屏 OpencvUVC代码验证后话 用OpenCV实现UVC摄像头的视频分屏。 Opencv opencv里有很多视频图像的处理功能。 UVC Usb 视频类,免驱动的。视频流格式有MJPG和YUY2。MJPG是RGB三色通道的。要对三通道进行分屏显示。 代码 import cv2 import numpy as np video …

123.【C语言】数据结构之快速排序挖坑法和前后指针法

目录 1.挖坑法 执行流程 代码 运行结果 可读性好的代码 2.前后指针法(双指针法) 执行流程 单趟排序代码 将单趟排序代码改造后 写法1 简洁的写法 3.思考题 1.挖坑法 执行流程 "挖坑法"顾名思义:要有坑位,一开始将关键值放入临时变量key中,在数组中形成…

JavaFx 21 项目Markdown 预览、编辑、新建、文件树、删除、重命名

项目文件结构 项目的源代码和资源文件存放在以下路径: 源代码: src/main/java/com/kong/markdown/ 包含多个 Java 文件,主要实现了应用的功能: App.java:主类,可能包含应用的启动逻辑。FileService.java:可能与文件操作相关的服务类。MainController.java:控制器类,可…

jenkins入门6 --拉取代码

Jenkins代码拉取 需要的插件,缺少的安装下 新建一个item,选择freestyle project 源码管理配置如下:需要添加git库地址,和登录git的用户密码 配置好后执行编译,成功后拉取的代码在工作空间里

数学建模入门——建模流程

摘要:本文介绍了数学建模的一般流程概述。 目录 一、前言 二、数据预处理 三、描述性统计分析 四、模型建立 五、模型评价 一、前言 本文将为想要入门数学建模的同学讲述数学建模的一般流程。但数学建模流程并非一成不变。虽有大致步骤,像分析问题、…

《机器学习》集成学习之随机森林

目录 一、集成学习 1、简介 2、集成学习的代表 3、XGBoost和随机森林的对比 相同点: 不同点: 二、Bagging之随机森林 1、简介 2、随机森林的核心思想 3、随机森林生成步骤 4、随机森林的优点 5、随机森林的缺点 三、随机森林的代码实现 1、…

【HarmonyOS NEXT】鸿蒙应用实现屏幕录制详解和源码

【HarmonyOS NEXT】鸿蒙应用实现屏幕录制详解和源码 一、前言 官方文档关于屏幕录制的API和示例介绍获取简单和突兀。使用起来会让上手程度变高。所以特意开篇文章,讲解屏幕录制的使用。官方文档参见:使用AVScreenCaptureRecorder录屏写文件(ArkTS) 二…

CSS——22.静态伪类(伪类是选择不同元素状态)

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>静态伪类</title> </head><body><a href"#">我爱学习</a></body> </html>单击链接前的样式 左键单击&#xff08;且…

JavaWeb开发(六)XML介绍

1. XML介绍 1.1. 什么是XML &#xff08;1&#xff09;XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种很像HTML的标记语言。   &#xff08;2&#xff09;XML 的设计宗旨是传输数据(目前主要是作为配置文件)&#xff0c;而不是显示数据。   &#xff08;3&a…

攻防世界 bug

发现有Register界面&#xff0c;先去注册 登录以后发现以下界面&#xff0c;点击Manage显示you are not admin&#xff0c;并且在注册界面用admin为注册名时显示用户名已存在。初步推测是设法改变admin的密码取得权限。 在主界面一通操作并没有什么发现&#xff0c;去findpw…

maven依赖的配置和排除依赖

1.依赖的配置 1.1位置&#xff1a;写在<properties></properties>标签之下&#xff0c;<project></project>里。 1.2语法固定的格式 <dependencies><dependency></dependency></dependencies> 1.3在 <dependency><…