StreamSocket确实好用!

为了实现实时的通信,TCP/UDP必取其一,有时候还得TCP+UDP一块用,不过说到Socket通信,之前我也写过文章,真是够麻烦的,很不好控制,牛逼的C程序员用Linux C能实现Socket通信,但是那个代码量……VB确实够简单,但是功能……Java和C#其实挺简单的,一个后台线程跑着,循环接收消息也就差不多了,但是Windows Phone这个熊孩子用了异步,Windows Phone 7.5的Socket通信异常麻烦,还不容易控制。到了WP8+.NET 4.5的时代,终于有个StreamSocket类诞生,让Socket通信方便不少。

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

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

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

StreamSocket clientSocket = new StreamSocket();

1.建立连接:

	
        async void connect()
        {
            try
            {
                HostName serverHost = new HostName("192.168.0.1");  //设置服务器IP
                await clientSocket.ConnectAsync(serverHost, 3000);  //设置服务器端口号
            }
            catch (Exception e)
            {
                Debug.WriteLine(e);
                clientSocket.Dispose();
                clientSocket = null;
            }
        }
如果没有异常,Socket连接便已经建立完毕,也不用考虑TCP或UDP类型,同时该方法自动实现异步工作,调用起来也非常的简单。

2.接收/发送数据:

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

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


        public bool ReadBoolean();

        public IBuffer ReadBuffer(uint length);
 
        public byte ReadByte();

        public void ReadBytes(byte[] value);
       
        public DateTimeOffset ReadDateTime();
        
        public double ReadDouble();
       
        public Guid ReadGuid();
       
        public short ReadInt16();
        
        public int ReadInt32();
        
        public long ReadInt64();
        
        public float ReadSingle();
        
        public string ReadString(uint codeUnitCount);
       
        public TimeSpan ReadTimeSpan();
        
        public ushort ReadUInt16();
        
        public uint ReadUInt32();
        
        public ulong ReadUInt64();

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

	
        public void WriteBoolean(bool value);

	public void WriteBuffer(IBuffer buffer);
     
        public void WriteBuffer(IBuffer buffer, uint start, uint count);
       
        public void WriteByte(byte value);
     
        public void WriteBytes(byte[] value);
        
	public 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);
        
	public 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/

转载请注明出处:http://blog.csdn.net/yuanguozhengjust/article/details/19175085

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值