C# NetworkStream 流的详解与示例

文章目录

  • 一、NetworkStream类的基本概念
    • 1.1 NetworkStream类概述
    • 1.2 NetworkStream类属性
    • 1.3 NetworkStream类方法
  • 二、NetworkStream的连接方式
  • 三、NetworkStream的传输模式
  • 四、NetworkStream类示例
    • 服务器端代码:
    • 客户端代码:
  • 五、总结


在这里插入图片描述

在C#中,网络编程通常涉及到使用Socket和NetworkStream类。NetworkStream类是System.Net.Sockets命名空间中的一部分,它提供了对网络流进行读写操作的功能。本文将详细介绍NetworkStream类的基本概念、属性和方法,并提供一个简单的示例。

一、NetworkStream类的基本概念

1.1 NetworkStream类概述

NetworkStream类是System.IO命名空间中Stream抽象类的子类,用于在网络连接上提供同步的、双向的、基于字节的数据流。它提供了对网络连接的读写操作,使得可以在两个网络应用程序之间传输数据。

1.2 NetworkStream类属性

(1)CanRead:获取一个值,表示是否可以读取网络流。

(2)CanWrite:获取一个值,表示是否可以写入网络流。

(3)CanSeek:获取一个值,表示是否可以seek(定位)网络流。

(4)Length:获取网络流的长度,即可以读取的数据量。

(5)Position:获取或设置网络流的当前位置。

1.3 NetworkStream类方法

(1)Read(byte[] buffer, int offset, int count):从网络流中读取数据,并存入缓冲区。

(2)Write(byte[] buffer, int offset, int count):向网络流中写入数据。

(3)Seek(long offset, SeekOrigin origin):在网络流中定位到一个特定的位置。

(4)SetLength(long value):设置网络流的长度。

(5)Flush:刷新网络流,确保所有缓冲区中的数据都被写入到网络连接中。

二、NetworkStream的连接方式

NetworkStream类通常与TcpClient类一起使用,TcpClient用于建立与服务器的连接。一旦建立了连接,就可以通过TcpClient的GetStream方法获取NetworkStream实例。

TcpClient client = new TcpClient("host", port);
NetworkStream stream = client.GetStream();

三、NetworkStream的传输模式

NetworkStream类支持两种传输模式:阻塞模式和非阻塞模式。

  • 阻塞模式:在阻塞模式下,当网络流没有可用的数据时,Read方法会阻塞当前线程,直到数据到达或超时。
  • 非阻塞模式:在非阻塞模式下,Read方法在没有可用的数据时会返回0,不会阻塞当前线程。

四、NetworkStream类示例

以下是一个简单的网络编程示例,演示了如何使用NetworkStream类在两个客户端之间传输数据。

服务器端代码:

using System;
using System.IO;
using System.Net.Sockets;
using System.Text;public class Server
{public static void Main(){// 创建一个TcpListener,监听1234端口TcpListener listener = new TcpListener(1234);listener.Start();Console.WriteLine("服务器启动,等待客户端连接...");// 接受客户端连接TcpClient client = listener.AcceptTcpClient();Console.WriteLine("客户端已连接。");// 使用NetworkStream读取数据NetworkStream stream = client.GetStream();byte[] buffer = new byte[1024];int bytesRead;// 读取客户端发送的数据while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0){byte[] result = new byte[bytesRead];Array.Copy(buffer, 0, result, 0, bytesRead);string receivedData = Encoding.UTF8.GetString(result);Console.WriteLine("收到客户端发送的数据: " + receivedData);}// 关闭连接client.Close();listener.Stop();Console.WriteLine("服务器已关闭。");}
}

客户端代码:

using System;
using System.IO;
using System.Net.Sockets;
using System.Text;public class Client
{public static void Main(){// 创建一个TcpClient,连接到服务器TcpClient client = new TcpClient("localhost", 1234);Console.WriteLine("客户端启动,正在连接服务器...");// 使用NetworkStream写入数据NetworkStream stream = client.GetStream();byte[] buffer = new byte[1024];string message = "Hello, Server!";byte[] data = Encoding.UTF8.GetBytes(message);// 向服务器发送数据stream.Write(data, 0, data.Length);Console.WriteLine("已发送消息: " + message);// 关闭连接client.Close();Console.WriteLine("客户端已关闭。");}
}

运行服务器和客户端程序,服务器将监听1234端口,等待客户端连接。当客户端连接后,服务器将读取客户端发送的数据
并打印出来。客户端将发送一条消息给服务器,然后关闭连接。

五、总结

NetworkStream类是C#中进行网络编程的重要工具之一,它提供了对网络流进行读写操作的功能。通过使用NetworkStream类,可以方便地在两个网络应用程序之间传输数据。在实际应用中,根据需要使用不同的方法来读取、写入、定位和刷新网络流,以实现网络通信的需求。

需要注意的是,在网络编程中,异常处理是非常重要的一环。在实际应用中,应该充分使用try-catch语句来处理可能发生的异常,如网络中断、连接超时等,以提高程序的稳定性和可靠性。

此外,NetworkStream类是同步的,这意味着在同一时刻只有一个线程可以访问网络流。如果需要在多线程环境下使用网络流,可以考虑使用异步编程模型,或者使用lock语句来确保线程安全。

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

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

相关文章

循环服务器TCP

服务器代码 /** * 文件名称:server.c* 创建者: mf* 创建日期:2024年05月20日* 描述:此程序实现了一个简易的TCP服务器,监听8888端口,接受客户端连接后,每隔一秒向客户端发送当前时间&#xff0…

VS Code添加高亮缩进功能

当代码缩进层次较多时,为了视觉上容易识别,一般希望可以多个缩进以不同颜色进行高亮显示, VS Code 中 indent-rainbow 插件可以实现这个功能。

蓝桥杯python组备赛指南

文章目录 前言刷题网站idle操作常用标准库mathdatetime 常见Q&A 前言 最近结束了比赛,我对比赛的过程进行了详细的复盘,并计划撰写一篇文章。这篇文章旨在为准备参加蓝桥杯的学弟学妹们提供帮助,我希望我的文章和笔记能对你们有所裨益。…

2024年150道高频Java面试题(七十二)

143. MyBatis 的工作原理是什么? MyBatis 是一个半ORM(对象关系映射)框架,它允许将对象与数据库中的记录相关联,同时保留对SQL语句的完全控制权。以下是MyBatis的工作原理: 配置SQL映射文件: …

TS中constructor使用public 、private 关键字

构造函数参数前的private关键字不是用于声明变量私有性的,而是与依赖注入(Dependency Injection,简称DI)相关。当你在构造函数参数中使用private关键字时,Angular会自动为你的组件或指令创建一个注入实例,并…

python列表生成式的魅力:轻松创建新列表

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 1. 列表生成式的基本结构 2. 列表生成式的进阶应用 3. 结合其他结构使用列表生成式 1. 列表…

HTML静态网页成品作业(HTML+CSS)——利物浦足球俱乐部介绍网页设计制作(5个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,共有5个页面。 二、作品演示 三、代码目录 四、网站代码 HTML部分代…

校园招新之获取进QQ群但未报名人员

校园的社团、实验室招新一般由是校领导会发一个QQ通知,让各个班的同学们进一个招新群。 群里面会有负责人提示大家报名,但是群成员不总是都会报名,我们需要的就是,找到那些,已经进群,但是没有报名的同学&am…

ELK 日志监控平台(一)- 快速搭建

文章目录 ELK 日志监控平台(一)- 快速搭建1.ELK 简介2.Elasticsearch安装部署3.Logstash安装部署4.Kibana安装部署5.日志收集DEMO5.1.创建SpringBoot应用依赖导入日志配置文件 logback.xml启动类目录结构启动项目 5.2.创建Logstash配置文件5.3.重新启动L…

当HR问你是否单身时,该怎么回答?

知识星球(星球名:芯片制造与封测技术社区,星球号:63559049)里的学员问:我是晶圆厂厂务工程师,最近在面试新工作,但是几乎每家HR都会问我同一个问题:你结婚没有&#xff1…

解密Spring Boot Starter与自动配置:探秘神奇的背后

starter可以理解为Spring Boot中的一站式集成启动器,包含了一系列可以集成到应用中的依赖项,可以快递集成spring组件及其框架,而不需要到处找示例代码。 一、为什么要用starter? 在springboot还没有出来之前,我们使用…

wps使用(解决毕业论文)

目录自动生成 页码自动生成 一部分使用I II III IV 格式,一部分使用1,2,3,4 格式 先设置全部文章为I II III IV 格式,然后再需要的地方再设置1,2,3,4 格式 一键设置中文、英文、数…

2024年全国大学生电工数学建模竞赛B题解析 | 数据处理 代码 论文分享

B 题:大学生平衡膳食食谱的优化设计及评价 1 数据预处理2 问题一2.1 问题1.12.1.1 评价体系的构建2.1.2 指标计算2.1.3 指标计算结果2.1.4 基于层次分析法的膳食营养评价模型2.1.5 评价模型的求解 2.2 问题1.22.2.1 食物与成分间拓扑关系的构建2.2.2 微调模型的建立…

【SpringBoot】整合百度文字识别

流程图 一、前期准备 1.1 打开百度智能云官网找到管理中心创建应用 全选文字识别 1.2 保存好AppId、API Key和Secret Key 1.3 找到通用场景文字识别,立即使用 1.4 根据自己需要,选择要开通的项目 二、代码编写 以通用文字识别(高精度版&am…

C# PipStream流的详解与示例

文章目录 PipStream概述PipStream的创建方法PipStream的播放方法PipStream的暂停方法PipStream的删除方法示例代码总结 本文将详细介绍C#中的PipStream流,包括其概述、创建方法、播放方法、暂停方法以及删除方法。通过示例代码,帮助读者更好地理解和掌握…

蚁小二:又一款高效自媒体工具,免费用户可发5个账号

其实自媒体的群发工具有几个,除了前几天介绍的融媒宝还有蚁小二等。因为融媒宝免费用户只能添加5个账号,所以不够用的朋友可以再下载蚁小二使用,这样就有10个账号可以发布了: 蚁小二简介 蚁小二是由长沙草儿绽放科技有限公司自主…

mysql - 索引原理

mysql索引原理 文中的查询, 以该表结构为例 CREATE TABLE user (id int NOT NULL COMMENT id,name varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT 姓名,age int NOT NULL COMMENT 年龄,sex tinyint(1) NOT NULL COMMENT 性别,phone varchar(255) CHARACTER SET utf8mb4…

设计模式9——适配器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 适配器模式(Adapte…

酷开科技以内容为契机,酷开系统向消费者需求的深度挖掘迈进一步

酷开系统还拥有强大的内容资源和推荐算法,能够根据消费者的兴趣爱好为其提供个性化的推荐服务。无论是电影、电视剧、综艺节目,还是新闻、体育、娱乐资讯,酷开系统都能帮助大家快速找到感兴趣的内容,并且通过智能推荐算法不断优化…

(南京观海微电子)——TFT LCM的作用

VCOM介绍 VCOM是液晶分子偏转的参考电压 ,要求要稳定,对液晶显示有直接影响,具体的屏不同的话 也是不同的。 电压的具体值是根据输入的数据以及Vcom电压大小来确定的,用来显示各种不同灰阶,也就是实现彩色显示GAMMA简…