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语句来确保线程安全。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++算法】BFS解决单源最短路问题相关经典算法题

1.迷宫中离入口最近的出口 首先我们可以将这道题目简化一下,可以往我们这一章的主题上面来想想。 我们利层序遍历来解决最短路径问题,是最经典的做法。我们可以从起点开始层序遍历, 并组在遍历的过程中记录当前遍历的层数。这样就能在找到出口的时候&…

基于open3d对kitti数据集检测结果可视化

前言 KITTI数据集是自动驾驶和计算机视觉领域中一个广泛使用的基准数据集,它提供了丰富的传感器数据,包括激光雷达、相机和GPS等。Open3D是一个功能强大的3D数据处理和可视化库,支持多种3D数据格式。本文将介绍如何使用Open3D对KITTI数据集的…

html简述——part1

HTML概述 HTML(HyperText Markup Language)是一种用于创建网页的标准标记语言,具体指超文本标记语言。它不是一种编程语言,而是一种标记语言,用于描述网页的结构和内容。通过HTML,开发者可以定义网页的标题…

sky walking日志采集以及注意事项

文章目录 1,sky walking日志采集功能概述2,采集log4j2日志3,采集logback日志4,效果展示5,注意事项 1,sky walking日志采集功能概述 在介绍Sky walking日志采集功能之前,最好在系统学习一遍日志…

使用FP8加速PyTorch训练的两种方法总结

在PyTorch中,FP8(8-bit 浮点数)是一个较新的数据类型,用于实现高效的神经网络训练和推理。它主要被设计来降低模型运行时的内存占用,并加快计算速度,同时尽量保持训练和推理的准确性。虽然PyTorch官方在标准…

primeflex样式库笔记 Display相关的案例

回顾 宽度设置的基本总结 w-full:表示widtdh:100%;占满父容器的宽度。 w-screen:表示占满整个屏幕的宽度。 w-1到w-12,是按百分比划分宽度,数字越大,占据的比例就越大。 w-1rem到w-30rem&…

欧拉函数、快速幂、扩展欧几里得算法、中国剩余定理和高斯消元

欧拉函数 给定 n 个正整数 ai,请你求出每个数的欧拉函数。 欧拉函数的定义1∼N 中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)。 若在算数基本定理中,Np1a11p2a2…pmm,则:ϕ(N) Np1−1/p1p2−1/p2…pm−1/pm 输…

WPF之打印与预览

目录 1,打印设置与管理。 1.1,引入程序集: 1.2,主要管理类介绍: 1.3,应用: 1.4,效果。 1.5,Demo链接。 2,打印。 2.1,主要参与打印的类与…

Mac JDK和SDK环境变量配置

一、Java JDK配置 1.下载并安装Java jdk1.8及以上,这个可以在网上自行搜索下载,这里不在详细描述 2.如果不知道JAVA_HOME的安装路径,可以输入命令查看:/usr/libexec/java_home -V ,如图 3.在终端输入命令&#xff1…

uniapp微信小程序解决open-type获取用户头像,返回临时路径问题!

解决 open-type 为 chooseAvatar,返回临时路径问题 文章目录 解决 open-type 为 chooseAvatar,返回临时路径问题效果图Demo获取头像回调数据结构效果图解决方式上传到服务器转base64 基于微信小程序获取头像昵称规则调整后,当小程序需要让用户…

CS 下载安装详解

目录 CS简介: CS下载地址: CS的安装: CS简介: CS为目前渗透中常用的一款工具,它的强大在于控制windows木马,CS主要控制windows木马。 CS下载地址: 链接:https://pan.baidu.com/…

华为OD机试【找出通过车辆最多颜色】(java)(100分)

1、题目描述 在一个狭小的路口,每秒只能通过一辆车,假设车辆的颜色只有 3 种,找出 N 秒内经过的最多颜色的车辆数量。 三种颜色编号为0 ,1 ,2。 2、输入描述 第一行输入的是通过的车辆颜色信息[0,1,1,2] &#xff0…

huggingface笔记: accelerate estimate-memory 命令

探索可用于某一机器的潜在模型时,了解模型的大小以及它是否适合当前显卡的内存是一个非常复杂的问题。为了缓解这个问题,Accelerate 提供了一个 命令行命令 accelerate estimate-memory。 accelerate estimate-memory {MODEL_NAME} --library_name {LIBR…

AIGC-风格迁移-style Injection in Diffusion-CVPR2024HighLight-论文精度

Style Injection in Diffusion: A Training-free Approach for Adapting Large-scale Diffusion Models for Style Transfer-CVPR2024HighLight 代码:https://github.com/jiwoogit/StyleID 论文:https://jiwoogit.github.io/StyleID_site/ 为了解决风格迁…

Oracle的安装以及一些相关问题

系列文章目录 Oracle的安装以及一些相关问题 文章目录 系列文章目录前言一、Oracle的安装二、常用命令三、误删dbf四、PLSQL乱码五、oracle更换数据库字符集总结 前言 一段时间没更新,主要最近一直在找工作,最终还是顺着春招找到工作了,现在…

使用nvm管理nodejs多个版本

在工作中,可能会遇到同时使用vue2和vue3开发项目,但他们的nodejs版本又不同,给你带来了困扰,不知道怎么办?这时就可以使用nvm管理多个nodejs版本 第一步:先去github上面下载nvm 这是下载地址:…

大语言模型的工程技巧(四)——梯度检查点

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型:从线性回归到通用人工智能》,欢迎有兴趣的读者多多支持。 本文将讨论如何利用梯度检查点算法来减少模型在训练时候(更准确地说是运行反向传播算法时)的内存开支。…

C++_string简单源码剖析:模拟实现string

文章目录 🚀1.构造与析构函数🚀2.迭代器🚀3.获取🚀 4.内存修改🚀5. 插入🚀6. 删除🚀7. 查找🚀8. 交换swap🚀9. 截取substr🚀10. 比较符号重载🚀11…

【IC设计】牛客网-序列检测习题总结

文章目录 状态机基础知识VL25 输入序列连续的序列检测VL26 含有无关项的序列检测VL27 不重叠序列检测VL28 输入序列不连续的序列检测参考资料 状态机基础知识 VL25 输入序列连续的序列检测 timescale 1ns/1ns module sequence_detect(input clk,input rst_n,input a,output re…

vue三级联动组件

背景 项目中经常出现三级下拉框组件的要求,这种组件其中一级发生变化,子级的组件就会发生变化如果这一个组件,单独作为搜索条件使用,很好写,同时作为搜索条件和form回写组件,回显就比较困难 子组件代码 将与…