NetworkStream Class

C#网络(Socket和NetworkStream) 在C#中,Socket和NetworkStream是用于进行网络通信的两种不同的API,Socket提供了更底层且灵活的网络通信功能,适用于对网络传输细节有较高要求的场景。而NetworkStream则是基于Socket的高级封装,提供了简化的读写接口,适用于大多数常见的网络通信任务。 阅读详情

命名空间:

System.Net.Sockets

Assemblies:

System.Net.Sockets.dll, System.dll, netstandard.dll

为网络访问提供数据的基础流。

public class NetworkStream : System.IO.Stream

继承

Object 
MarshalByRefObject   
Stream
NetworkStream

示例

下面的代码示例演示如何创建NetworkStream从连接StreamSocket并执行基本的同步阻塞 I/O。

// Examples for constructors that do not specify file permission.

// Create the NetworkStream for communicating with the remote host.
NetworkStream myNetworkStream;

if (networkStreamOwnsSocket){
     myNetworkStream = new NetworkStream(mySocket, true);          
}
else{
     myNetworkStream = new NetworkStream(mySocket);     
}

注解
NetworkStream类提供了用于通过发送和接收数据的方法Stream处于阻止模式套接字。 有关详细信息,有关阻止与非阻止性Sockets,请参阅使用异步客户端套接字。 可以使用NetworkStream的这两个同步和异步数据传输类。 有关同步和异步通信的详细信息,请参阅套接字。

若要创建NetworkStream,则必须提供连接Socket。 此外可以指定哪些FileAccess权限NetworkStream通过提供具有Socket。 默认情况下,关闭NetworkStream不会关闭所提供Socket。 如果你想NetworkStream能够关闭所提供的权限Socket,则必须指定true的值的ownsSocket参数。

使用Write和Read方法用于简单的单线程同步阻塞 I/O。 如果你想要处理 I/O 使用单独的线程,请考虑使用BeginWrite并EndWrite方法,或BeginRead和EndRead方法进行通信。

NetworkStream不支持对网络数据流的随机访问。 值CanSeek属性,用于指示流是否支持查找,始终是false; 读取Position属性,读取Length属性或调用Seek方法将引发NotSupportedException.

读取和写入操作可以同时执行的实例上NetworkStream类,而无需同步。 只要没有个写入操作的一个唯一线程和读取操作的一个唯一的线程,读取之间将存在交叉引用和写线程并没有进行的同步不需要。

构造函数

名称说明
NetworkStream(Socket)为指定的 Socket 创建 NetworkStream 类的新实例。
NetworkStream(Socket, Boolean)用指定的 Socket 所属权为指定的 Socket 初始化 NetworkStream 类的新实例。
NetworkStream(Socket, FileAccess)用指定的访问权限为指定的 NetworkStream 创建 Socket 类的新实例。
NetworkStream(Socket, FileAccess, Boolean)用指定的访问权限和指定的 Socket 所属权为指定的 Socket 创建 NetworkStream 类的新实例。

属性

名称说明
CanRead获取一个值,该值指示 NetworkStream 是否支持读取。
CanSeek获取一个值,该值指示流是否支持查找。 当前不支持此属性,它始终返回 false。
CanTimeout指示超时属性是否可用于 NetworkStream。
CanWrite获取一个值,该值指示 NetworkStream 是否支持写入。
DataAvailable获取一个值,该值指示在要读取的 NetworkStream 上是否有可用的数据。
Length获取流上可用数据的长度。 此属性当前不受支持,总是引发 NotSupportedException。
Position获取或设置流中的当前位置。 此属性当前不受支持,总是引发 NotSupportedException。
Readable获取或设置一个值,该值指示 NetworkStream 是否可以读取。
ReadTimeout获取或设置读取操作阻止等待数据的时间。
Socket获取基础 Socket。
Writeable获取一个值,该值指示 NetworkStream 是否可写入数据。
WriteTimeout获取或设置写入操作阻止等待数据的时间。

方法

名称说明
BeginRead(Byte[], Int32, Int32, AsyncCallback, Object)从 NetworkStream 开始异步读取。
BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object)开始向流异步写入。
Close(Int32)等待指定的时间获许发送数据之后,关闭 NetworkStream。
CopyTo(Stream)从当前流中读取字节并将其写入到另一流中。
(Inherited from Stream)
CopyTo(Stream, Int32)使用指定的缓冲区大小,从当前流中读取字节并将其写入到另一流中。
(Inherited from Stream)
CopyToAsync(Stream)从当前流中异步读取字节并将其写入到另一个流中。
(Inherited from Stream)
CopyToAsync(Stream, Int32)使用指定的缓冲区大小,从当前流中异步读取字节并将其写入到另一流中。
(Inherited from Stream)
CopyToAsync(Stream, Int32, CancellationToken)使用指定的缓冲区大小和取消令牌,从当前流中异步读取字节并将其写入到另一个流中。
(Inherited from Stream)
CreateObjRef(Type)创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。
(Inherited from MarshalByRefObject)
CreateWaitHandle()分配 WaitHandle 对象。
(Inherited from Stream)
Dispose()释放由 Stream 使用的所有资源。
(Inherited from Stream)
Dispose(Boolean)释放由 NetworkStream 占用的非托管资源,还可以另外再释放托管资源。
EndRead(IAsyncResult)处理异步读取的结束。
EndWrite(IAsyncResult)处理异步写入的结束。
Equals(Object)确定指定的对象是否等于当前对象。
(Inherited from Object)
Finalize()释放由 NetworkStream 使用的所有资源。
Flush()刷新流中的数据。 此方法保留供将来使用。
FlushAsync()异步清除此流的所有缓冲区并导致所有缓冲数据都写入基础设备中。
(Inherited from Stream)
FlushAsync(CancellationToken)以异步操作形式刷新流中的数据。
GetHashCode()作为默认哈希函数。
(Inherited from Object)
GetLifetimeService()检索控制此实例的生存期策略的当前生存期服务对象。
(Inherited from MarshalByRefObject)
GetType()获取当前实例的 Type。
(Inherited from Object)
InitializeLifetimeService()获取生存期服务对象来控制此实例的生存期策略。
(Inherited from MarshalByRefObject)
MemberwiseClone()创建当前 Object 的浅表副本。
(Inherited from Object)
MemberwiseClone(Boolean)创建当前 MarshalByRefObject 对象的浅表副本。
(Inherited from MarshalByRefObject)
ObjectInvariant()提供对 Contract 的支持。
(Inherited from Stream)
Read(Byte[], Int32, Int32)从 NetworkStream 读取数据。
ReadAsync(Byte[], Int32, Int32)从当前流异步读取字节序列,并将流中的位置提升读取的字节数。
(Inherited from Stream)
Seek(Int64, SeekOrigin)将流的当前位置设置为给定值。 此方法当前不受支持,总是引发 NotSupportedException。
SetLength(Int64)设置流的长度。 此方法始终引发 NotSupportedException。
ToString()返回表示当前对象的字符串。
(Inherited from Object)
Write(Byte[], Int32, Int32)将数据写入 NetworkStream。
WriteAsync(Byte[], Int32, Int32)将字节序列异步写入当前流,并将流的当前位置提升写入的字节数。
(Inherited from Stream)
C# NetworkStream 原理与高可靠网络编程实战 NetworkStream 是 .NET 中封装 TCP 字节流通信的核心抽象,它将底层 Socket 的复杂性(如部分发送、半包接收、连接状态管理)统一映射为标准 Stream 接口,实现‘写即送达、读即有效’的语义契约。其设计严格遵循 TCP 协议的流式特性,故不支持 Seek 和 Length,强调顺序读写与可靠性保障。在工业通信、自定义协议(如 MQTT/PLC)、大文件传输等场景中,NetworkStream 提供比 HttpClient 更底层、比原始 Socket 更安全的平衡点。本文结合粘包 阅读详情

相关推荐

C# Stream设计哲学与高阶实践:从契约思维到Pipe演进

Stream是.NET I/O体系的核心抽象,远不止字节读写工具——它通过CanRead、CanSeek等能力属性定义明确的契约边界,支撑同步/异步双轨执行、装饰器式流水线组合及跨层资源管控。理解其设计原理,有助于规避HttpClient上传死锁、MemoryStream乱码、NetworkStream超时挂起等高频问题;在高性能场景下,更需向PipeReader/PipeWriter范式演进,实现零拷贝、背压控制与可观测性注入。本文结合FileStream、MemoryStream、NetworkStre

unixboy 378

C# NetworkStream 流的详解与示例

NetworkStream类是System.IO命名空间中Stream抽象类的子类,用于在网络连接上提供同步的、双向的、基于字节的数据流。它提供了对网络连接的读写操作,使得可以在两个网络应用程序之间传输数据。NetworkStream类是C#中进行网络编程的重要工具之一,它提供了对网络流进行读写操作的功能。通过使用NetworkStream类,可以方便地在两个网络应用程序之间传输数据。在实际应用中,根据需要使用不同的方法来读取、写入、定位和刷新网络流,以实现网络通信的需求。

qq_35320456的博客 3216

C# Stream底层原理与高性能实践:从Dispose到Pipe的深度解析

Stream是.NET I/O编程的核心抽象,本质是字节序列的契约式访问接口,其性能与稳定性取决于对CanSeek、CanTimeout等能力契约的准确理解。底层机制如缓冲区生命周期、异步状态机开销、Dispose与IAsyncDisposable协同、以及Pipelines零拷贝模型,共同决定高并发文件处理、网络传输和大内存操作的实际表现。掌握FileStream缓冲区为何8KB最优、NetworkStream超时需Socket层控制、MemoryStream容量爆炸规避方法,可显著降低GC压力、句柄泄漏

diaojin6880的博客 385

【Stream—7】NetworkStream相关知识分享

一、NetworkStream的作用 和先前的流有所不同,NetworkStream的特殊性可以在它的命名空间中得以了解(System.Net.Sockets),聪明的你马上就会反应过来:既然是在网络中传输的流,那必然有某种协议或者规则约束他,不错,这种协议就是Tcp/Ip协议。这个是什么东西?别急,我先让大家了解以下NetworkStream的作用:如果服务器和客户端之间基于TCP连接...

gman344的博客 1613

C# Stream深度解析:内存、生命周期与跨平台I/O契约

Stream是.NET中连接托管代码与操作系统I/O子系统的核心抽象,远不止Read/Write基础方法——它承载着内存管理、资源生命周期、异步调度与跨平台兼容性等多重契约。理解其CanRead/CanWrite的动态语义、Position操作的底层开销、Dispose()对句柄与数据完整性的决定性影响,是避免OutOfMemoryException、句柄泄漏和数据截断的关键。在高并发文件处理、HTTP流式响应、加密压缩管道等场景中,Stream的缓冲策略、所有权移交和异步实现路径(IOCP vs 线程池伪

aobai7842的博客 367

当ModbusRTU遇上串口服务器:C#如何用Socket+NModbus4报文逻辑进行通讯?

本文详细介绍了如何在C#中使用Socket和NModbus4库实现ModbusRTU协议与串口服务器的通讯。通过混合架构设计,开发者可以高效地将传统串口设备接入以太网,同时保持ModbusRTU的报文逻辑。文章包含核心代码示例、性能优化技巧及常见问题排查指南,助力工业自动化系统实现稳定高效的网络通讯。

weixin_30892889的博客 364

C#网络编程之基础语法 网络流(NetworkStream) 文本流(Stream) 文件流(Filestream )

Socket 的创建。 // 创建负责监听的Socket // 第一个参数AddressFamily设置网络寻址协议,InterNetwork表示IPV4 // 第二个参数SocketType设置数据传输方式(Socket类型),这个要根据第三个参数来设置,Stream此类型的 Socket 与单个对方主机进行通信,并且在通信开始之前需要远程主机连接 // 第三个参数为UDP协议时,第二个参数就要为Dgram(报文) S

csdn2990的博客 4123

H3C交换机S-MLAG实战:如何用bond4模式实现服务器高可用(附避坑指南)

本文详细介绍了H3C交换机S-MLAG技术与服务器bond4模式的实战配置,帮助实现跨设备链路聚合的服务器高可用方案。通过解析S-MLAG技术优势、bond4模式选择、关键配置步骤及常见问题排查,提供了一套完整的避坑指南和优化建议,适用于企业级网络架构的高可用需求。

weixin_30790841的博客 464

C# NetworkStream、ConcurrentDictionary、Socket、SerialPort、广域IP、AutoResetEvent

项目使用

weixin_39354845的博客 1338

ROS2+PYTHON VENV虚拟环境配置方法

ROS2+PYTHON VENV配置方法本篇针对的是python。

下雨夏云的博客 554

【实战】CANOE实现UDS安全访问过程的CAPL脚本

首先我已经有了包含安全访问算法的dll文件,并通过Diagnostics/ISO TP Configuration中加载了此dll文件,如下。在on start部分,要将“ECU qualifier“作为参数,执行diagSetTarget函数。这个函数是用于设置tester从现在开始与之通信的目标ECU,并配置/建立与该ECU的通信通道。我最近在做密钥学习上位机时,遇到一些问题:如何用CAPL脚本实现安全访问过程?ECU Qualifier可以通过加载cdd文件后,在如下位置找到。CAPL脚本如何编写。

weixin_46481662的博客 4938

C# Stream深度解析:统一IO契约与高并发流式处理

Stream是.NET中统一数据源抽象的核心接口,它并非简单‘字节管道’,而是涵盖同步/异步、可寻址/不可寻址、有界/无界等多元IO场景的最小公分母契约。其设计基于抽象基类而非接口,以保障状态一致性、默认行为兜底与资源生命周期控制;CanRead/CanSeek等属性实为运行时能力快照,误用将引发异常风暴与性能雪崩。在微服务通信、文件服务与实时数据处理等典型场景中,正确理解Position语义、Length边界及子类差异(如FileStream内核缓冲、NetworkStream半包处理、MemoryStr

世范水晶 665

基于多头注意力时间卷积网络(MATCN)的虚拟电厂短期功率预测模型

​时空特征解耦​:TCN负责时间模式,注意力捕捉空间关联​动态门控机制​:自适应调整两种特征的融合比例​多尺度感知​:膨胀卷积覆盖5分钟到24小时的时间跨度​轻量化设计​:参数量比传统Transformer减少52%

hasakie的博客 322

从“异环”切人BUG看战斗系统状态机设计与演出稳定性

在动作游戏与二次元RPG的开发中,战斗系统的状态机设计直接决定操作手感与稳定性。当角色切换、技能释放、过场演出等模块各自维护状态时,极易因状态不同步引发“按钮失灵”或“切人失败”等异常。本期以《异环》1.3版本“异环残虹”中玩家热议的切人BUG为切入点,解析状态机冲突、冷却异常重置、单位归属数据刷新等常见根因,并给出请求队列、强制重置、逻辑层与表现层分离等工程实践方案。同时结合T女士决战的高水平演出设计,探讨在复杂剧情场景下如何平衡演出效果与战斗系统健壮性。无论是游戏开发者、测试工程师,还是对战斗机制感兴趣

benben 376

进阶篇第8节:寄存器压力——寄存器溢出对性能的影响及优化

**摘要:GPU寄存器是最快的存储单元(1周期访问),但数量有限。过高的寄存器使用会导致溢出(变量存入慢速本地内存)或降低占用率(减少并发线程数),严重影响性能。优化方法包括复用变量、使用共享内存替代寄存器数组、限制寄存器数量(--maxrregcount)等。实际测试显示,将寄存器使用从48个降至24个可使性能提升37%。分析工具如Nsight Compute可帮助检测寄存器压力。面试常见问题涉及寄存器溢出的检测与优化策略。

PeterPan的博客 94

Yield Management软件:Lam Research二次开发_(5).缺陷分析与分类方法

在半导体制造过程中,缺陷分析和分类是提高良率管理(Yield Management)的关键步骤。通过准确地识别和分类缺陷,可以更好地理解工艺过程中的问题,从而采取有效的措施来提高生产效率和产品质量。本节将详细介绍缺陷分析和分类的方法,包括缺陷检测、特征提取、分类算法及其在Lam Research软件中的应用。

2401_87715305的博客 686

C# MAIL CLASS

 using System; using System.Text; using System.IO; using System.net; using System.Net.Sockets; using System.Collections; namespace lion_Office.Data.Library.MailClass { /* Create By lion 2002-11-20 01:

enginetanmary的专栏 547

LVGL 蜂巢气泡菜单(Hex Menu)

h。

摸鱼专家 173

C# Mail Class改版

 using System;using System.Text;using System.IO;using System.Net;using System.Net.Sockets;using System.Collections;namespace Lion.Web.Mail{ /*   Create By lion   2004-04-23 19:00   Copyright (C) 2

enginetanmary的专栏 619

Python蓝色跳动的爱心(完整代码)

Python语言实现蓝色跳动的爱心的完整代码。 代码分析 这段代码使用了 库来创建一个动态的爱心图案,并在屏幕上显示带有动态效果的“我爱你”字样。以下是对这段代码的详细分析: 用于创建图形用户界面(GUI)。 用于生成随机数,主要用于控制爱心图案的扩散效果。 中的 , , , 用于数学计算,生成爱心形状和扩散效果。 包含了 等常量,用于控制控件的对齐方式。 2. 全局变量定义 , : 定义画布的大小。 , : 爱心的中心坐标。 : 用于定义爱心形状的缩放

AIGC 1917

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

POP3 Client as a C# Class(转自CodeProject)

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 572

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

学习C++之命名空间

本文详细介绍了C++中命名空间的核心功能与作用、基本用法、高级用法、实践注意事项与应用举例等等知识点。

C兔·码农 512

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

.NET 网络编程 TCPClient 、 TCPListener 、 Socket 、 UdpClient

再继续进行之前,我们假设客户端可以发送多条消息,而服务端要不断的接收来自客户端发送的消息,但是上面的代码只能接收客户端发来的一条消息,因为它已经输出了“输入Q键退出”,说明程序已经执行完毕,无法再进行任何动作。本章的所有操作都是同步操作,像上面的代码也只是作为一个入门的范例,实际当中,一个服务端只能为一个客户端提供服务的情况是不存在的,下面就让我们来看看上面所说的第四种情况,如何进行异步的服务端编程。我们接着再进行进一步处理,服务端将收到的字符串改为大写,然后回发,客户端接收后打印。

Kaizen的博客 1671
上一篇: TcpClient Class
下一篇: Jquery操作复选框(CheckBox)的取值赋值实现代码
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值