转载自: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. Docker Compose安装以及入门

    Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用. Compose 简介 Compose 项目是 Docker 官方的开源 ...

  2. JAVAWEB开发之JSTL标签库的使用、 自己定义EL函数、自己定义标签(带属性的、带标签体的)

    JSTL  JSTL简单介绍: JSTL的全称:JSP Standard Tag Library,JSP标准标签库 JSTL的作用:   提供给Java Web开发者一个标准通用的标签函数库   和E ...

  3. Docker CE 镜像源站

    sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-proper ...

  4. PyCharm使用Anaconda新建的环境

    首先,创建一个环境用来安装Tensorflow: conda create -n tensorflow python=3.5.6 安装以后,在Anaconda Navigator可以看到已经增加了一个 ...

  5. linux清除缓存

    linux清除缓存:需要root权限$ sync$ echo 3 >/proc/sys/vm/drop_caches 上面的echo 3 是清理所有缓存 echo 0 是不释放缓存 echo 1 ...

  6. np.percentile获取中位数、百分位数

    给定一个递增数组a,求它的中位数. np.percentile(a,50) 中位数就是50%处的数字,也可以获得0%.100%处的数字,0%处的数字就是第一个数字,100%处的数字就是最后一个数字.1 ...

  7. make[1]: *** [storage/perfschema/unittest/CMakeFiles/pfs_connect_attr-t.dir/all] 错误 2 解决方法

    make[2]: *** [storage/perfschema/unittest/pfs_connect_attr-t] 错误 1 make[1]: *** [storage/perfschema/ ...

  8. redmine在linux上的mysql性能优化方法与问题排查方案

    iredmine的linux服务器mysql性能优化方法与问题排查方案     问题定位:   客户端工具: 1. 浏览器inspect-tool的network timing工具分析   2. 浏览 ...

  9. Mathematica查看内部定义

    << GeneralUtilities`; PrintDefinitions[IntegerReverse]

  10. why-the-default-authentication-hadoop-is-unsecured ?

    https://www.learningjournal.guru/article/hadoop/hadoop-security-using-kerberos/ https://stackoverflo ...