◇NetworkStream类专门提供用于网络访问的基础数据流。他实现通过网络套接字发送和接受数据的标准.net框架流机制。支持对网络数据流的同步和异步访问。
◇.NET 框架中,NetworkStream流支持两方面的操作。
◇1)写入流,主要用到的方法是Write(),写入时从数据结构到流的数据传输,也就将数据写入NetworkStream。
◇2)读取流,主要用到的方法是Read(),读取是从流到数据结构的数据传输,也就从NetworkStram读取数据.
◇3)注意,接收和发送的数据最好都通过byte型数组来完成,因为几乎所有对象都可以保存入流。
◇NetworkStream对象可以从TcpClient对象的GetStream()方法返回,例如:
NetworkStream streamToServer = client.GetStream();
◇注意:不管是客户端程序,还是服务器程序,都需要一个NetworkStream对象,来接收或者发送数据流。其中,客户端程序的TcpClient对象可以直接实例化,而服务器的TcpClient对象则通过TcpListener对象的AcceptTcpClient()方法返回,代码如下:
TcpClient client = listener.AcceptTcpClient(); //服务器端的client对象 TcpClient client = new TcpClient(); //客户端的client对象
◇现在我们来写两个程序,一个程序是服务器端的,另一个程序是客户端的。
◇1)服务器段程序实现功能:监听一个端口,接收并且打印出接收到的数据,然后把这个数据转为大写,发送回去。(备注已经写的很清楚了)
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 IPAddress ip = new IPAddress(new byte[] {127,0,0,1}); //设置ip 6 TcpListener listener = new TcpListener(ip,8500); //创建出一个监听对象 7 8 listener.Start(); //开始监听 9 10 TcpClient client = listener.AcceptTcpClient(); //与客户端建立连接 11 12 Console.WriteLine("连接成功,{0}+++++{1}",client.Client.LocalEndPoint,client.Client.RemoteEndPoint); //打印出连接信息 13 14 15 byte[] buffer = new byte[8192]; 16 NetworkStream stream = client.GetStream(); //利用GetStream()方法创建出一个NetworkStream对象 17 int numb = stream.Read(buffer, 0, 8192); //利用read()方法,把接收的数据写入到byte型数组内 18 19 string s = Encoding.Unicode.GetString(buffer,0,numb); //利用Encoding的GetString方法,将byte数组内的数据转换成string类型 20 Console.WriteLine("{0}",s); //输出到屏幕上 21 s = s.ToUpper(); //转化成大写 22 buffer = Encoding.Unicode.GetBytes(s); //利用Encoding的GetString方法,将string字符串重新又转变成byte型数组 23 stream.Write(buffer,0,buffer.Length); //通过Write方法,将数据传回客户端 24 Console.WriteLine(s); 25 Console.ReadKey(); 26 } 27 }
◇注意,这是一个同步的实现方式。
◇再来写一个与之对应的客户端程序:实现连接上述服务器端口,向该端口发送数据,并且接受从以上服务器传回来的数据并打印,也是一个同步的方式,具体代码如下:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Console.WriteLine("Client Running ..."); 6 TcpClient client; 7 8 try 9 { 10 client = new TcpClient(); 11 client.Connect("localhost", 8500); // 与服务器连接 12 } 13 catch (Exception ex) 14 { 15 Console.WriteLine(ex.Message); 16 return; 17 } 18 // 打印连接到的服务端信息 19 Console.WriteLine("Server Connected!{0} --> {1}", 20 client.Client.LocalEndPoint, client.Client.RemoteEndPoint); 21 22 string msg = ""Welcome To TraceFact.Net""; 23 NetworkStream streamToServer = client.GetStream(); //创建一个客户端的NetworkStream对象 24 25 byte[] buffer = Encoding.Unicode.GetBytes(msg); // 获得缓存 26 streamToServer.Write(buffer, 0, buffer.Length); // 发往服务器 27 Console.WriteLine("Sent: {0}", msg); 28 29 int numb = streamToServer.Read(buffer,0,buffer.Length); //接收来自服务器传回来的数据,保存到buffer数组(byte型)中去 30 string s = Encoding.Unicode.GetString(buffer,0,buffer.Length); //将数组中的内容转化成string字符串,并且输出 31 Console.WriteLine(s); 32 ConsoleKey key; 33 34 do //对程序进行阻塞,用于查看结果 35 { 36 key = Console.ReadKey(true).Key; 37 } while (key != ConsoleKey.Q); 38 39 40 Console.ReadLine(); 41 } 42 }
◇两个程序都是控制台程序,写在不同的解决方案内,两个程序写好以后,先运行服务端程序,然后再运行客户端程序,就能清楚地看到结果啦。