C#语言的网络编程

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.rhkb.cn/news/504222.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云安全博客阅读(三)

WAF强固之盾:机器学习赋能下的语义分析 WAF 中,传统的基于正则的检测方法依赖正则的运营更新,以不断防护新的攻击方法; 主要流程为:HTTP包 -> payload解码 -> 正则匹配 但是,攻击者可以通过修改攻…

个人博客搭建(二)—Typora+PicGo+OSS

个人博客站—运维鹿: http://www.kervin24.top CSDN博客—做个超努力的小奚: 做个超努力的小奚-CSDN博客 一、前言 博客搭建完一直没有更新,因为WordPress自带的文档编辑器不方便,以前用CSDN写作的时候,习惯了Typora。最近对比了…

spring boot 集成 knife4j

1、knife4j介绍以及环境介绍 knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名knife4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍!其底层是对Springfox的封装,使用方式也和Springfox一致,只是对接口…

案例解读 | 香港某多元化综合金融企业基础监控+网管平台建设实践

PART01 项目背景 01客户简介案例客户是一家创立20多年的香港某多元化综合金融企业,其业务范围涵盖证券、期货、资产管理、财富管理等,凭借广泛的业务网络和多元化的金融服务产品,在市场中拥有显著的影响力。02痛点分析随着业务版图的持续拓展…

KCP解读:C#库类图

本文是系列文章中的一篇,内容由浅到深进行剖析,为了方便理解建议按顺序一一阅读。 KCP技术原理 KCP解读:基础消息收发 KCP解读:重传机制 KCP解读:滑动窗口 KCP解读:拥塞控制 本系列的源码基于https://gith…

Nginx:Stream模块

什么是 Stream 模块? Stream 模块 是 Nginx 的一个核心模块,专为处理非 HTTP 协议的流量(TCP 和 UDP 流量)而设计。它可以用来负载均衡和代理 TCP 或 UDP 连接,适用于多种应用场景,如: 数据库集群(MySQL、PostgreSQL 等)邮件服务器(SMTP、IMAP、POP3)游戏服务器VoI…

Profinet转EtherNet/IP网关连接AB PLC的应用案例

某大型制造企业的生产车间同时采用了西门子 S7 - 1500 PLC 作为核心控制系统的一部分,负责主要生产流程的控制与数据处理;而在特定生产环节,由于历史设备遗留或工艺配套需求,存在使用 AB PLC 的情况。这就导致了在整个自动化生产系…

arcgisPro加载CGCS2000天地图后,如何转成米单位

1、导入加载的天地图影像服务,一开始是经纬度显示的。 2、右键地图,选择需要调整的投影坐标,这里选择坐标如下: 3、点击确定后,就可以调整成米单位的了。 4、切换后结果如下: 如有需要,可调整成…

2025新春烟花代码(二)HTML5实现孔明灯和烟花效果

效果展示 源代码 <!DOCTYPE html> <html lang"en"> <script>var _hmt _hmt || [];(function () {var hm document.createElement("script");hm.src "https://hm.baidu.com/hm.js?45f95f1bfde85c7777c3d1157e8c2d34";var …

机器人技术:ModbusTCP转CCLINKIE网关应用

在当今自动化生产与智能制造领域&#xff0c;ModbusTCP转CC-LinkIE网关KJ-MTCPZ-CCIES的应用正日益成为提升生产效率、实现设备间高效通信的重要技术手段。这一转换技术不仅打破了不同通信协议间的壁垒&#xff0c;还为机器人产品的应用提供了更为广阔的舞台。ModbusTCP作为一种…

Openwrt @ rk3568平台 固件编译实践(二)- ledeWRT版本

目录 ledeWRT介绍固件编译下载代码修改feed源更新并安装编译第三方软件包制作用于eMMC烧写的rootfs基于lede发行版验证烧写rk3568.img, LEDE wrt启动成功refhttps://blog.csdn.net/zc21463071/article/details/106751361介绍rk3568平台下, lede 大神版 openwrt固件的下载、编译…

【linux系统之redis6】redisTemplate的使用方法

新版本的application.yml配置文件 spring:data:redis:host: 192.168.1.102port: 6379lettuce:pool:max-active: 8min-idle: 1max-idle: 0max-wait: 100redisTemplate使用方法 <dependencies><dependency><groupId>org.springframework.boot</groupId>…

【算法】字符串算法技巧系列

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 引入&#xff1a;字符串相关算法技巧 1&#xff1a;字符串转数组 2&#xff1a;子字符串 3&#xff…

掌握正则表达式:从入门到精通的实战指南

文章目录 &#x1f30d;一.正则表达式❄️1.为什么学习正则表达式❄️ 2.基本介绍❄️3.分析底层实现 &#x1f30d;二.正则表达式的语法❄️1.字符匹配❄️2.量词❄️3.定位符4.分组和引用❄️6.非贪婪匹配❄️7.分支结构❄️实际应用 &#x1f30d; 三.正则标表达式的三个常用…

leetcode 5. 最长回文子串

题目如下 本题可以这么来想设有一个回文串s"112211"当我们去掉左右两边的"1"时s任然是回文串。 反过来说现有字符串 "x1221y"(x,y都是未知字符)当且仅当x y时这个字符串是回文串。 故我们可以令i j为某一个字符串的左右两端然后有如下情况: i…

BoltzGnu Boltztrap数据绘图脚本

BoltzGnu包含四个Gnuplot脚本&#xff0c;允许绘制BoltzTraP输出数据。 下载网址&#xff1a; https://github.com/K4ys4r/BoltzGnu 1. pTRACE_E.gp -> To plot Trasport proporties as a function of energy at define Temperature2. pTRACE_E_multT.gp -> To pl…

AIA - APLIC之三(附APLIC处理流程图)

本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 APLIC复位 APLIC复位后,其所有状态都变得有效且一致,但以下情况除外: 每个中断域的domaincfg寄存器(spec第 4.5.1 节);可能是machine-level interrupt domain的MSI地址配置寄存器(spec第4.5.3 和4.5…

【MySQL】深度学习数据库开发技术:使用CC++语言访问数据库

**前言&#xff1a;**本节内容介绍使用C/C访问数据库&#xff0c; 包括对数据库的增删查改操作。 主要是学习一些接口的调用&#xff0c; 废话不多说&#xff0c; 开始我们的学习吧&#xff01; ps:本节内容比较容易&#xff0c; 友友们放心观看哦&#xff01; 目录 准备mysql…

微信小程序map组件所有markers展示在视野范围内

注意&#xff1a;使用include-points属性不生效&#xff0c;要通过createMapContext实现 <template><view class"map-box"><map id"map" class"map" :markers"markers" :enable-traffic"true" :enable-poi&…

全新免押租赁系统打造便捷安全的租赁体验

内容概要 全新免押租赁系统的推出&#xff0c;标志着租赁行业的一次重大变革。这个系统的最大特点就是“免押金”&#xff0c;大大减轻了用户在租赁过程中的经济负担。从此&#xff0c;不再需要为一部手机或其他商品支付高昂的押金&#xff0c;用户只需通过简单的信用评估&…