文章目录
- 一、NetworkStream类的基本概念
-
- [1.1 NetworkStream类概述](#1.1 NetworkStream类概述)
- [1.2 NetworkStream类属性](#1.2 NetworkStream类属性)
- [1.3 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实例。
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语句来确保线程安全。