C# 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实例。

csharp 复制代码
TcpClient client = new TcpClient("host", port);
NetworkStream stream = client.GetStream();

三、NetworkStream的传输模式

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

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

四、NetworkStream类示例

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

服务器端代码:

csharp 复制代码
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("服务器已关闭。");
    }
}

客户端代码:

csharp 复制代码
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语句来确保线程安全。

相关推荐
真真-真真15 分钟前
WebXR
linux·运维·服务器
轩辰~37 分钟前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
向宇it1 小时前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎
wanhengidc1 小时前
短视频运营行业该如何选择服务器?
运维·服务器
yngsqq1 小时前
一键打断线(根据相交点打断)——CAD c# 二次开发
windows·microsoft·c#
s_yellowfish2 小时前
Linux服务器pm2 运行chatgpt-on-wechat,搭建微信群ai机器人
linux·服务器·chatgpt
vvw&2 小时前
如何在 Ubuntu 22.04 上安装 Ansible 教程
linux·运维·服务器·ubuntu·开源·ansible·devops
我一定会有钱2 小时前
【linux】NFS实验
linux·服务器
王铁柱子哟-2 小时前
解决 正在下载VS Code 服务器... 问题
运维·服务器
Ven%2 小时前
如何在防火墙上指定ip访问服务器上任何端口呢
linux·服务器·网络·深度学习·tcp/ip