zoukankan      html  css  js  c++  java
  • StreamSocket

    转载自:http://blog.csdn.net/yuanguozhengjust/article/details/19175085

    StreamSocket的基本流程和一般的Socket通信操作类似,分为:建立连接、发送/接收数据、中断连接。

    三个步骤都很简单,结合Async和Await关键字,在WP8/Win8平台即能轻松实现Socket通信

    首先实例化一个新的对象:

    1 StreamSocket clientSocket = new StreamSocket();

    1.建立连接:

     1 async void connect()  
     2 {  
     3     try  
     4     {  
     5         HostName serverHost = new HostName("192.168.0.1");  //设置服务器IP  
     6         await clientSocket.ConnectAsync(serverHost, 3000);  //设置服务器端口号  
     7     }  
     8     catch (Exception e)  
     9     {  
    10         Debug.WriteLine(e);  
    11         clientSocket.Dispose();  
    12         clientSocket = null;  
    13     }  
    14 }  

    如果没有异常,Socket连接便已经建立完毕,也不用考虑TCP或UDP类型,同时该方法自动实现异步工作,调用起来也非常的简单。

    2.接收/发送数据:

    由于Socket通信从本质上说是数据流的传输,即byte类型,StreamSocket使用DataReader类和DataWriter类来接收和发送数据流,两个类封装了不少实用的方法,但归根结底是对byte类型数据读取和发送的封装。下面介绍两个类所提供的一些方法。

    DataReader所提供的读取数据的方法:

     1 public bool ReadBoolean();  
     2   
     3 public IBuffer ReadBuffer(uint length);  
     4   
     5 public byte ReadByte();  
     6   
     7 public void ReadBytes(byte[] value);  
     8   
     9 public DateTimeOffset ReadDateTime();  
    10   
    11 public double ReadDouble();  
    12   
    13 public Guid ReadGuid();  
    14   
    15 public short ReadInt16();  
    16   
    17 public int ReadInt32();  
    18   
    19 public long ReadInt64();  
    20   
    21 public float ReadSingle();  
    22   
    23 public string ReadString(uint codeUnitCount);  
    24   
    25 public TimeSpan ReadTimeSpan();  
    26   
    27 public ushort ReadUInt16();  
    28   
    29 public uint ReadUInt32();  
    30   
    31 public ulong ReadUInt64();  

    DataWriter所提供的发送数据的方法:

    public void WriteBoolean(bool value);  
      
    void WriteBuffer(IBuffer buffer);  
      
    public void WriteBuffer(IBuffer buffer, uint start, uint count);  
      
    public void WriteByte(byte value);  
      
    public void WriteBytes(byte[] value);  
      
    void WriteDateTime(DateTimeOffset value);  
      
    public void WriteDouble(double value);  
      
    public void WriteGuid(Guid value);  
      
    public void WriteInt16(short value);  
      
    public void WriteInt32(int value);  
      
    public void WriteInt64(long value);  
      
    public void WriteSingle(float value);  
      
    public uint WriteString(string value);  
      
    void WriteTimeSpan(TimeSpan value);  
      
    public void WriteUInt16(ushort value);  
      
    public void WriteUInt32(uint value);  
      
    public void WriteUInt64(ulong value);  

    二者皆提供直接获取或发送常用类型的方法,即可以直接传递相关参数,或者直接从流中获取常用类型的返回值,当然直接处理流也是可以的。下面举出读写数据的例子各一例。
    首先要保证StreamSocket类所实例化的对象不能为空,并保证其处于连接状态,不过可以利用try/catch语句。

    接收数据:

    DataReader reader = new DataReader(clientSocket.InputStream); //实例化reader对象,并以StreamSocket的输入流为reader的来源  
    reader.InputStreamOptions = InputStreamOptions.Partial;  //采用异步方式  
    await reader.LoadAsync(1024);  //获取一定大小的数据流  
    string response = reader.ReadString(reader.UnconsumedBufferLength);  //获取字符串,指定为reader的未读取缓冲区的长度 

    发送数据:

    DataWriter writer = new DataWriter(clientSocket.OutputStream);  //实例化writer对象,以StreamSocket的输出流作为writer的方向  
    string content = "ABCDEFGH";  //发送一字符串  
    byte[] data = Encoding.UTF8.GetBytes(content);  //将字符串转换为字节类型,完全可以不用转换  
    writer.WriteBytes(data);  //写入字节流,当然可以使用WriteString直接写入字符串  
    await writer.StoreAsync();  //异步发送数据  
    writer.DetachStream();  //分离  
    writer.Dispose();  //结束writer  

    建议在使用的时候将这些过程放入try/catch语句当中,以保证稳定性。

    发送、接收数据的方法和过程就如此简单,相比Windows Phone 7.5上的Socket+SocketAsyncEventArgs简单多了,而且稳定得多,让开发者在数据处理的问题上更节省了时间和精力。由于使用异步,非阻塞UI线程,相比于Android使用的多线程,该形式又更省系统资源,这是Windows Phone 8非常进步的一点。

    3.中断连接

    中断的方法无论何种形式、平台,都比较简单,这里只提供代码

    clientSocket.Dispose();  
    clientSocket = null;  

    这样,StreamSocket的基本使用方法就是如此,非常简单省事,对于同样适用Windows Runtime的Windows RT及Windows 8/8.1平台,此方法同样适用,随着Windows Phone 8.1的推出,微软的平台统一性将更加凸显,届时WP的编程模式又将进一步改进,更多更好的方法将出现在.NET编程当中,为开发者带来极大的便利!

    实例,仅供参考:https://voiceworkwp.codeplex.com/

  • 相关阅读:
    用windows下的画板画蒙娜丽莎
    记账
    谁说VISTA的游戏兼容性差?
    Silverlight3系列(四)数据绑定 Data Binding 1 Virus
    Silverlight3系列(二)Silverlight3+wcf+在不使用证书的情况下自定义用户名密码验证 Virus
    Silverlight3系列(七)数据绑定 Data Binding 3 数据类型转换 Data Converter Virus
    Silverlight3系列(六)数据验证 Data Validation Virus
    ocs2007二次开发:扩展tab标签 Virus
    Silverlight3系列(八)数据绑定 Data Binding 3 数据模板 Data Templates Virus
    Silverlight3系列(九)Silverlight 及其相关技术简介 Virus
  • 原文地址:https://www.cnblogs.com/lhwblog/p/6696173.html
Copyright © 2011-2022 走看看