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

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, ); //设置服务器端口号
}
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);  

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(); //获取一定大小的数据流
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/

StreamSocket的更多相关文章

  1. WP8.1通过StreamSocket连接C++服务器

    注:当服务端和手机模拟器运行在一台机器时,会有奇怪错误.将服务端放在其它机器上更改客户端连接地址,运行正常.或者直接用本机modern调试也可以. 实例化一个对象 StreamSocket clien ...

  2. WP10通过StreamSocket连接C++服务器

    注:当服务端和手机模拟器运行在一台机器时,会有奇怪错误.将服务端放在其它机器上更改客户端连接地址,运行正常.或者直接用本机modern调试也可以. 实例化一个对象 StreamSocket _clie ...

  3. c++ poco StreamSocket tcpclient测试用例

    1.代码 #include <iostream> #include "Poco/Net/Socket.h" #include "Poco/Net/Stream ...

  4. 【Win 10 应用开发】TCP通信过程

    基于TCP协议的通信,估计大伙儿都不陌生的,以前玩.net或玩C++的时候应该玩得很多吧.现在老周简单介绍一下在RT中如何用. TCP是基于连接的,所以,肯定有一方是监听者,通常称服务端或服务器,它负 ...

  5. 使用GDB 追踪依赖poco的so程序,core dump文件分析.

    前言 在windows 下 系统核心态程序蓝屏,会产生dump文件. 用户级程序在设置后,程序崩溃也会产生dump文件.以方便开发者用windbg进行分析. so,linux 系统也有一套这样的东东- ...

  6. Android之Socket通信、List加载更多、Spinner下拉列表

    Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...

  7. 浏览器-09 javascript引擎和Chromium网络栈

    语言的运行 C/C++语言 使用编译器直接将它们编译成本地代码(机器指令),这是由开发人员在代码编写完成之后实施; 用户只是使用这些编译好的本地代码,这些本地代码被系统的加载器加载执行,由操作系统调度 ...

  8. Windows Phone 十七、Socket

    Socket 常用类型 StreamSocket:Socket对象 StreamSocketListener:Socket监听对象,适用于服务端 服务端代码 <Grid x:Name=" ...

  9. 例子:Bluetooth app to device sample

    本例子演示了: 判断蓝牙是否打开,是通过一个HRsult值为0x8007048F的异常来判断的 catch (Exception ex) { if ((uint)ex.HResult == 0x800 ...

随机推荐

  1. Tensorflow之Slim使用

    一些参考文档: 官方文档: TensorFlow-Slim image classification model library TensorFlow-Slim使用说明 TensorFlow-Slim ...

  2. Exception thrown on Scheduler.Worker thread. Add `onError` handling

    <html> <head></head> <body> java.lang.IllegalStateException: Exception throw ...

  3. Unity应用架构设计(7)——IoC工厂理念先行

    一谈到 『IoC』,有经验的程序员马上会联想到控制反转,将创建对象的责任反转给工厂.IoC是依赖注入 『DI』 的核心,大名鼎鼎的Spring框架就是一个非常卓越的的控制反转.依赖注入框架.遗憾的是, ...

  4. Xilinx的ISE14.7和PlanAhead与win10系统的兼容性问题解决方案

    Xilinx的ISE14.7和PlanAhead与win10系统的兼容性问题解决方案 2018年07月03日 18:27:57 feq123 阅读数:4495   今天在新电脑的win10系统上安装I ...

  5. vue 实站技巧总结

    多个页面都使用的到方法,放在 vue.prototype上会很方便 刚接触 vue的时候做过一件傻事,因为封装了一个异步请求接口post,放在 post.js文件里面,然后在每个需要使用异步请求的页面 ...

  6. Windows上使用Vagrant打造Laravel Homestead可协同跨平台开发环境

    1.简介 Laravel 致力于让整个 PHP 开发过程变得让人愉悦,包括本地开发环境,为此官方为我们提供了一整套本地开发环境 —— Laravel Homestead. Laravel Homest ...

  7. 【计算机网络】OSI七层模型图解

    1.物理层 建立.维护.断开物理连接.(由底层网络定义协议) 2.数据链路层 建立逻辑连接.进行硬件地址寻址.差错校验等功能.(由底层网络定义协议) 将比特组合成字节进而组合成帧,用MAC地址访问介质 ...

  8. 【GMT43智能液晶模块】基于HAL库的SDRAM和LCD驱动例程(MDK工程&CubeMX工程)

    说明: 1.该工程基于HAL库实现动态存储器SDRAM驱动以及液晶控制器LCD驱动. 2.工程通过STM32CubeMX(Version 4.22.0)配置生成,可直接打开进行配置. 3.KEIL M ...

  9. SkyWalking

    介绍 SkyWalking 创建与2015年,提供分布式追踪功能.从5.x开始,项目进化为一个完成功能的Application Performance Management系统.他被用于追踪.监控和诊 ...

  10. HTTP 04 web 服务器

    用单台虚拟主机实现多个域名 HTTP/1.1 允许一台 HTTP 服务器搭建多个 web 站点, 例如提供 web 托管服务的供应商, 可以用一台服务器为多位客户服务, 也可以以每位客户持有的域名运行 ...