网络流、文本流、文件流
在网络编程中,常用的流有网流、文本流、文件流。
网络流用于传输数流;
文本流用于读写文本;
文件流用于读写文件;
1.网络流:NetworkStream类提供用于网络访问的基础流,NetworkStream实现了通过网络套接字发送和接收数据的标准.Net框架流机制。NetworkStream支持数据流 同步和异步访问。但不支持网络数据流的随机访问。CanSeek属性总为False:读取Position属性或者调用CanSeek方法将引发NotSupportedExceiption异常。
NetworkStream类的构造方法一下几种
public NetworkStream(Socket socket)
参数为套接字.该方法的用法如下
NetworkStream newStream=new NetworkStream(mySock);
public NetworkStream(Socket scoket,bool ownsSocket);
第二个参数:创建对指定套接字具有读/写权限的NetworkStream对象
NetworkStream newStream=new NetStream(mySocket,true);
public NetworkStream(Socket socket,FileAccess access)
此方法用于创建不拥有套接字也可以控制NetworkStream对象访问权限的NetworkStream对象。
NetworkStream newStream=new NetworkStream(mysocket,System.IO.FileAcess.Read)
public NetworkStream(Socket socket,FileAcess access,bool bool ownsSocket)
用于创建可拥有套接字对象的附加访问权限的F网络流对象。
NetworkStream newStream=new NetworkStream(Socket socket,System.FileAccess.Read,ture);
NetworkStream类的主要属性
CanRead 获取一个值,该值指示当前流是否支持读取
CanSeek 获取一个值,该值指示当前流是否支持查找。该属性总是返回false
CanWrite 获取一个值,该值指示当前流是否写入
DataAvailable 获取一个值,该值指示是否可以在流上读取数据
Length 流上可用数据的长度。此属性始终引发NotSupportedException
Position 获取或设置流中的当前位置.此属性始终引发NotSupportException;
NetworkStream类最常用的方法
Read()用于读取数据,该方法的定义用下
public override int Read(int byte[] buffer,int offset,int size)
用法如下
NetworkStream newStream =new NetworkStream(mySocket)
byte[] myByte=new Byte[1024];
newStream.Read(myByte,0,myByte.Length);
newStream.Flush();
Flush方法定义如下
public override void Flush();
Write()用于向流中写入数据
该方法定义如下
public override int Read(int byte[] buffer,int offset,int size)
用法如下
NetWorkStream newStream=new NetworkStream(mySocket);
byte[] myByte=new byte[1034];
newStream.Write(myByte,0,myByte.Length);
newSteam.Flush();
文本流
顾名思义文本流用于文本的读写。要谈文本首先了解是文本的编码。在网络编程中,最常用的是ASCII、UTF8、和BIgEndianUnicode码
其中ASCII码最常用,几乎所有的协议都支持。不过SMTP和POP3协议使用utf8编码,但也支持ASCII码,BigEndianUnicode码是双字节码,一般协议不用
因为双字节解码比较麻烦,容易出错。UTF8和BigEndianUnicode编码支持汉字传输
向文件写文件流
1.向文件中写入文本数据,并且新数据代替旧数据
StreamWriter sw=null;
sw=new StreamWriter(@"d:/test.txt",false,System.Text.Encoding.UTF8);
sw.Write("aaaaaaaaa");
sw.Close();
2.向文件中写入文本数据,把新数据放在旧数据的后面
StreamWriter sw=null;
sw=new StreamWriter(@"d:/test.txt",true,System.Text.Encoding.UTF8);
sw.Write("bbbbbbbbbb");
sw.Close();
向网络写入文本
string str="aaaaaaaaaaaaaaaaaaaaaa";
byte[] myByte=System.Text.Encoding.UTF8.GetBytes(str);
NetworkStream netStream= new NetworkStream(mySocket);
netStream.Write(myByte,0,myByte.Lenth);
从文件读取文本
StreamReader sr=null;
sr=new StreamReader(@"d:/test.txt",system.Text.Encoding.UTF8);
string mystr=sr.ReadToEnd();
sr.Close();
从网络读取文件
string str="aaaaaaaaaaaa";
byte[] myByte =System.Text.Encoding.UTF8.GetBytes(str);
NetworkStream netStream=new NetwrokStream(mySocket);
netStream.Read(myByte,0,myByte.Length);
文件流
用于读写非文本的文件。文件类型可以是各种各样的,无论是文本文件、还是图片文件、压缩文件、可执行文件等,都可以用文件流
来实现读写功能。
将网络流数据写入文件
FileStream fileStream=new FileStream(path,FileMode.OpenOrCreate,FileAccess.Write);
int readNumber=0;
byte[] bye=new byte[8];
while((readNumber=stream.Read(bye,0,8))>0)
{
fileStream.Write(bye,0,readNumber);
fileStream.Flush();
}
fileStream.Close();
读文件并写入网络流
FileStream fileStream =new FileStream(path,FileMode.Open,FileAcess.Read);
int number;
byte[] bb=new byte[8];
NetworkStream stream=new NetwrokStream(newclient);
while((number=fileStream.Read(bb,0,8))!=0)
{
stream.Write(bb,0,8);
stream.Flush();
}
filestream.close();