(2) Socket网络编程(C#)----同步传输字符串

◇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     }

  ◇两个程序都是控制台程序,写在不同的解决方案内,两个程序写好以后,先运行服务端程序,然后再运行客户端程序,就能清楚地看到结果啦。

原文地址:https://www.cnblogs.com/kaolalovemiaomiao/p/5597455.html