• (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     }

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

  • 相关阅读:
    通用数据权限的思考与设计
    MyBatis传入参数为list、数组、map写法
    MyBatis的foreach查询(List、Array、Map)
    heX——基于 HTML5 和 Node.JS 开发桌面应用
    优秀设计:12个带给你灵感的创意单页网站作品
    So Easy!让开发人员更轻松的工具和资源
    触摸手势图标大全:48款触摸手势图标免费下载
    放松的周末,一起欣赏15个华丽的艺术品
    Skytte:一款令人印象深刻的 HTML5 射击游戏
    分享本年度最佳的15个 Photoshop 实例教程
  • 原文地址:https://www.cnblogs.com/kaolalovemiaomiao/p/5597455.html
Copyright © 2020-2023  润新知