C#语言的网络编程
C#语言的网络编程
引言
随着互联网的飞速发展,网络编程成为了软件开发中的一个重要领域。C#语言作为一种现代编程语言,凭借其丰富的类库、良好的可读性和强大的功能,广泛应用于开发各种网络应用程序。无论是Windows应用、Web应用还是云服务,C#都能胜任。本文将深入探讨C#语言在网络编程中的应用,涵盖基础知识、常用类库、协议解析、实际案例等多个方面,以期帮助读者更好地理解和掌握C#的网络编程。
1. 网络编程基础
1.1 网络基础知识
网络编程的基础是计算机网络的概念。计算机网络是由多个计算机及其相互连接的设备组成的系统,这些设备可以通过网络协议进行通信。常见的网络协议包括TCP/IP、UDP、HTTP、FTP等。C#语言通过使用这些协议提供网络通信的能力。
TCP(传输控制协议)是一种面向连接的协议,提供可靠的、顺序的数据传输。UDP(用户数据报协议)是一种无连接的协议,适合传输不需要保证可靠性的数据。HTTP(超文本传输协议)是Web应用程序的基础协议,而FTP(文件传输协议)用于在网络上传输文件。
1.2 C#网络编程的概述
C#的网络编程主要通过System.Net命名空间提供的类来实现。这个命名空间包含了处理网络协议、传输和解析数据所需的各种类。这些类使得开发者能够轻松地创建网络应用,如HTTP客户端、UDP服务器、TCP服务器等。
2. 常用的类与方法
在C#中,常用的网络编程类主要包括TcpClient、TcpListener、UdpClient、HttpWebRequest、HttpWebResponse等。下面将详细介绍这些类的使用方法。
2.1 TcpClient 和 TcpListener
TcpClient类是用于创建TCP客户端的类,而TcpListener则用于创建TCP服务器。以下是它们的基本用法。
2.1.1 创建TCP服务器
```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading;
class TcpServer { private TcpListener _listener;
public void Start(int port)
{_listener = new TcpListener(IPAddress.Any, port);_listener.Start();Console.WriteLine("TCP服务器已启动,等待客户端连接...");while (true){var client = _listener.AcceptTcpClient();Console.WriteLine("客户端已连接.");Thread clientThread = new Thread(HandleClient);clientThread.Start(client);}
}private void HandleClient(object clientObj)
{using (var client = (TcpClient)clientObj)using (var stream = client.GetStream()){byte[] buffer = new byte[1024];int bytesRead = stream.Read(buffer, 0, buffer.Length);string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);Console.WriteLine("收到消息: " + message);byte[] response = Encoding.UTF8.GetBytes("Echo: " + message);stream.Write(response, 0, response.Length);}
}public void Stop()
{_listener.Stop();
}
} ```
2.1.2 创建TCP客户端
```csharp using System; using System.Net.Sockets; using System.Text;
class TcpClientApp { public void Connect(string server, int port) { using (var client = new TcpClient(server, port)) using (var stream = client.GetStream()) { string message = "Hello, Server!"; byte[] data = Encoding.UTF8.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.UTF8.GetString(buffer, 0, bytesRead);Console.WriteLine("收到回复: " + response);}
}
} ```
2.2 UdpClient
UdpClient类提供了对UDP协议的支持,适用于需要快速传输并且对丢包不敏感的场景。以下是UDP服务器和客户端的基本实现。
2.2.1 UDP服务器
```csharp using System; using System.Net; using System.Net.Sockets; using System.Text;
class UdpServer { public void Start(int port) { using (var udpClient = new UdpClient(port)) { Console.WriteLine("UDP服务器已启动,等待客户端消息..."); IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
while (true){byte[] receivedBytes = udpClient.Receive(ref remoteEndPoint);string message = Encoding.UTF8.GetString(receivedBytes);Console.WriteLine("收到消息: " + message);}}
}
} ```
2.2.2 UDP客户端
```csharp using System; using System.Net; using System.Net.Sockets; using System.Text;
class UdpClientApp { public void Send(string server, int port) { using (var udpClient = new UdpClient()) { string message = "Hello, UDP Server!"; byte[] data = Encoding.UTF8.GetBytes(message); udpClient.Send(data, data.Length, server, port); Console.WriteLine("发送消息: " + message); } } } ```
2.3 HttpWebRequest 和 HttpWebResponse
在处理HTTP请求时,HttpWebRequest和HttpWebResponse类非常有用。它们允许开发者向Web服务发送请求并接收响应。
2.3.1 发送HTTP请求
```csharp using System; using System.IO; using System.Net;
class HttpClientApp { public void GetHttpResponse(string url) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET";
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()){Console.WriteLine("响应状态代码: " + response.StatusCode);using (StreamReader reader = new StreamReader(response.GetResponseStream())){string content = reader.ReadToEnd();Console.WriteLine("响应内容: " + content);}}
}
} ```
3. 协议解析
在网络编程中,理解网络协议的工作原理非常重要。比如,HTTP协议是应用层协议,使用请求和响应的方式进行通信。C#开发者可以使用HttpClient类来更简便地处理HTTP请求。
3.1 使用HttpClient进行HTTP请求
```csharp using System; using System.Net.Http; using System.Threading.Tasks;
class AsyncHttpClientApp { private static readonly HttpClient client = new HttpClient();
public async Task GetHttpResponseAsync(string url)
{HttpResponseMessage response = await client.GetAsync(url);response.EnsureSuccessStatusCode();string responseBody = await response.Content.ReadAsStringAsync();Console.WriteLine("响应内容: " + responseBody);
}
} ```
4. 实际案例
4.1 聊天室示例
我们可以利用TCP和多线程来实现一个简单的聊天室。服务端负责管理所有已连接的客户端,允许他们进行聊天。
4.1.1 聊天室服务器
```csharp using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading;
class ChatServer { private TcpListener _listener; private List _clients = new List ();
public void Start(int port)
{_listener = new TcpListener(IPAddress.Any, port);_listener.Start();Console.WriteLine("聊天室服务器已启动...");while (true){var client = _listener.AcceptTcpClient();_clients.Add(client);Console.WriteLine("新用户已连接.");Thread clientThread = new Thread(HandleClient);clientThread.Start(client);}
}private void HandleClient(object clientObj)
{using (var client = (TcpClient)clientObj)using (var stream = client.GetStream()){byte[] buffer = new byte[1024];while (true){int bytesRead = stream.Read(buffer, 0, buffer.Length);if (bytesRead == 0) break; // 客户端断开连接string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);Console.WriteLine("收到消息: " + message);Broadcast(message, client);}}
}private void Broadcast(string message, TcpClient sender)
{foreach (var client in _clients){if (client != sender){var stream = client.GetStream();byte[] data = Encoding.UTF8.GetBytes(message);stream.Write(data, 0, data.Length);}}
}
} ```
4.1.2 聊天室客户端
```csharp using System; using System.Net.Sockets; using System.Text; using System.Threading;
class ChatClient { private TcpClient _client; private NetworkStream _stream;
public void Connect(string server, int port)
{_client = new TcpClient(server, port);_stream = _client.GetStream();Console.WriteLine("已连接到聊天室服务器.");Thread receiveThread = new Thread(ReceiveMessages);receiveThread.Start();while (true){string message = Console.ReadLine();SendMessage(message);}
}private void SendMessage(string message)
{byte[] data = Encoding.UTF8.GetBytes(message);_stream.Write(data, 0, data.Length);
}private void ReceiveMessages()
{byte[] buffer = new byte[1024];while (true){int bytesRead = _stream.Read(buffer, 0, buffer.Length);string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);Console.WriteLine("收到消息: " + message);}
}
} ```
5. 总结
本文介绍了C#语言在网络编程中的基本知识及应用,包括常用类的使用、协议解析以及实际案例的展示。C#十分适合于开发各种网络应用,无论是简单的客户端-服务器程序还是复杂的Web服务都能通过C#轻松实现。通过不断地实践,读者可以逐渐掌握网络编程的技巧,为将来的开发打下坚实的基础。
网络编程是一个不断发展、技术更新迅速的领域,在未来,我们可以预见C#及其相关技术将在这个领域继续发挥重要作用。希望本文能为C#网络编程的学习者提供一些有价值的参考和指导。
相关文章:
C#语言的网络编程
C#语言的网络编程 引言 随着互联网的飞速发展,网络编程成为了软件开发中的一个重要领域。C#语言作为一种现代编程语言,凭借其丰富的类库、良好的可读性和强大的功能,广泛应用于开发各种网络应用程序。无论是Windows应用、Web应用还是云服务…...
【操作系统】课程 4调度与死锁 同步测练 章节测验
4.1知识点导图 处理机调度与死锁相关内容的文字整理: 基本准则 资源利用率:使系统中的处理机和其他所有资源都尽可能地保持忙碌状态。系统吞吐量:单位时间内系统所完成的作业数。公平性:使各进程都获得合理的CPU时间,而…...
如何查看已经安装的python版本和相关路径信息
如何查看已经安装的python版本和相关路径信息 本文目录: 一、通过命令行模式查询 1、通过命令where python 2、通过命令print(sys.executable) 二、在 Anaconda Navigator 中 三、只安装python的环境下 一、通过命令行模式查询 同时按windowR键,输入cmd&#x…...
设计模式-结构型-适配器模式
在软件开发中,随着系统的不断扩展和模块的不断增加,往往会遇到不同模块之间接口不兼容的情况。此时,如果我们能通过某种方式将一个接口转化为另一个接口,那么开发工作将变得更加灵活和高效。适配器模式(Adapter Patter…...
鸿蒙操作系统(HarmonyOS)
鸿蒙操作系统(HarmonyOS)是华为公司推出的一款面向未来、面向全场景的分布式操作系统。它旨在为用户提供一个更加智能、便捷和安全的操作环境,支持多种终端设备之间的无缝协作。在鸿蒙应用开发中,ArkUI作为官方推荐的用户界面开发…...
基于海思soc的智能产品开发(camera sensor的两种接口)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 对于嵌入式开发设备来说,除了图像显示,图像输入也是很重要的一部分。说到图像输入,就不得不提到camera。目前ca…...
解密LLM结构化输出:代码示例与原理分析
解密LLM结构化输出:代码示例与原理分析 一、LLM结构化输出概述 1. 结构化输出的定义与优势 结构化输出指的是语言模型(LLM)生成的遵循特定格式(如JSON、XML)的数据,这些数据易于解析和处理。相较于非结构…...
Go语言的数据类型
Go语言的数据类型详解 Go语言是一门具有简洁、高效并且强类型的编程语言。它的设计理念之一是让程序员能够以清晰、简明的方式表达自己的意图。在Go语言中,数据类型是其基础构建块之一,理解不同数据类型的特点和使用场景对于编写高效的Go程序至关重要。…...
复杂园区网基本分支的构建
目录 1、各主机进行网络配置。2、交换机配置。3、配置路由交换,进行测试。4、配置路由器接口和静态路由,进行测试。5、最后测试任意两台主机通信情况 模拟环境链接 拓扑结构 说明: VLAN标签在上面的一定是GigabitEthernet接口的,…...
如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?Java .class文件编码和JVM运行期内存编码?
如何很快将文件转换成另外一种编码格式? 利用VS Code右下角的"选择编码"功能,选择"通过编码保存"可以很方便将文件转换成另外一种编码格式。尤其,在测试w/ BOM或w/o BOM, 或者ANSI编码和UTF编码转换,特别方便。VS文件另…...
《C++11》Lambda 匿名函数从入门到进阶 优缺点分析 示例
Lambda 匿名函数从入门到进阶 C11 引入了 lambda 表达式,这是一种非常强大的功能,可以让我们在代码中定义匿名函数。它们不仅使代码更加简洁,而且在处理回调、算法和多线程编程时极为方便。本文将带你从入门到进阶,全面了解 C11 …...
连接Milvus
连接到Milvus 验证Milvus服务器正在侦听哪个本地端口。将容器名称替换为您自己的名称。 docker port milvus-standalone 19530/tcp docker port milvus-standalone 2379/tcp docker port milvus-standalone 192.168.1.242:9091/api/v1/health 使用浏览器访问连接地址htt…...
Linux——修改文件夹的所属用户组和用户
一、命令 举例: 授权 MOT17 文件夹 给 hust_xxx 用户: sudo chown -R hust_xxx:hust_xxx MOT17参考 Linux授权文件夹给用户...
Vue Amazing UI 组件库(Vue3+TypeScript+Vite 等最新技术栈开发)
Vue Amazing UI 一个 Vue 3 组件库 使用 TypeScript,都是单文件组件 (SFC),支持 tree shaking 有点意思 English | 中文 Vue Amazing UI 是一个基于 Vue 3、TypeScript、Vite 等最新技术栈开发构建的现代化组件库,包含丰富的 UI 组件和常…...
计算机Steam报错failedtoloadsteamui.dll怎么解决?DLL报错要怎么修复?
计算机Steam报错“Failed to Load SteamUI.dll”?这里有专业的解决方案! 作为软件开发领域的一名从业者,我深知电脑在运行过程中可能会遇到的各种问题,尤其是像Steam这样的大型游戏平台。今天,我将为大家科普一下Stea…...
如何开发一个简单的 dApp
后端合约 执行 sui move new resource_manage 创建一个包 接着就可以开始编写合约了 首先创建两个 Struct 用来创建 Profile 并记录在 State 中 public struct State has key {id: UID,users: Table<address, address>, }public struct Profile has key {id: UID,nam…...
TDengine 签约智园数字,助力化工园区智联未来
近年来,随着化工行业对安全、环保、高效运营的要求日益提高,化工园区的数字化转型成为必然趋势。从数据孤岛到全面互联,从基础监控到智能分析,如何高效管理和利用时序数据已成为化工园区智能化升级的关键环节。作为一家专注于时序…...
《Python游戏编程入门》注-第9章8
2 游戏信息的显示 在游戏窗口的上部会显示游戏分数、游戏关卡、剩余砖块数以及剩余小球数等信息,如图12所示。 图12 游戏信息显示 使用如图13所示的代码实现以上功能。 图13 显示游戏信息的代码 其中,print_text()函数MyLibrary....
js逆向实战(1)-- 某☁️音乐下载
下载某云音乐源文件.mp4格式 首先随便点进一首歌,如图所示获取该音乐id,然后点击播放键,打开F12进行查询XHR 由此可知,实际请求网址是 https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token「你的token」url需带…...
AIA - APLIC之三(附APLIC处理流程图)
本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 APLIC复位 APLIC复位后,其所有状态都变得有效且一致,但以下情况除外: 每个中断域的domaincfg寄存器(spec第 4.5.1 节);可能是machine-level interrupt domain的MSI地址配置寄存器(spec第4.5.3 和4.5…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
