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

相关推荐
一只哒布刘21 分钟前
NFS服务器
运维·服务器
lihuhelihu2 小时前
第3章 CentOS系统管理
linux·运维·服务器·计算机网络·ubuntu·centos·云计算
山东布谷科技官方3 小时前
布谷直播源码部署服务器关于数据库配置的详细说明
运维·服务器·数据库·直播系统源码·直播源码·直播系统搭建·直播软件开发
爱吃喵的鲤鱼3 小时前
linux进程的状态之环境变量
linux·运维·服务器·开发语言·c++
小码编匠3 小时前
一款 C# 编写的神经网络计算图框架
后端·神经网络·c#
荒Huang4 小时前
Linux挖矿病毒(kswapd0进程使cpu爆满)
linux·运维·服务器
九河云4 小时前
如何选择适合的AWS EC2实例类型
服务器·云计算·aws
其乐无涯5 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器
写bug的小屁孩5 小时前
前后端交互接口(三)
运维·服务器·数据库·windows·用户界面·qt6.3