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/

时间: 2024-11-07 12:19:43

StreamSocket的相关文章

Windows 8 Metro 关于StreamSocket与原异步Socket

前一篇 <Windows 8 Metro 关于 StreamSocket MSDN示例阅读>我们基本懂得如何通过StreamSocket 做监听.连接.发送接收数据. 同时前一篇留下的几个疑问,我们在这里进行实验和解答. 在“原有的异步Socket”连接方式与现在WIN8 Metro App 的StreamSocket 如何通信呢? 首先解释下这里说的“原有的异步Socket” 是什么. 在await/async 关键字出现前,我们的Socket异步是依靠System.Net 以及 Syste

Windows8 Metro界面下的StreamSocket 发送数据与接收数据

上次说了这么用StreamSocket来建立连接,现在看看怎么用StreamSocket发送和接收数据. 首先我们知道StreamSocket实例中有InputStream 和 OutputStream 这两个属性,看名字就知道我们接下来的操作一定与它离不开关系了. 那么先说发送,发送数据时我们将会用到 Windows.Storage.Streams.DataWriter 来帮助我们方便的吧数据发送出去,当然这个操作也和链接一样是异步的. 首先需要从已经建立好连接的 StreamSocke t实

Socket通信(转)

一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信.通过建立sock

Socket 通信原理(Android客户端和服务器以TCP&amp;&amp;UDP方式互通)

ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当,还望指教. 一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是s

Windows Phone 十七、Socket

Socket 常用类型 StreamSocket:Socket对象 StreamSocketListener:Socket监听对象,适用于服务端 服务端代码 1 <Grid x:Name="LayoutRoot"> 2 3 <Grid.RowDefinitions> 4 <RowDefinition Height="Auto"/> 5 <RowDefinition Height="*"/> 6 &l

c#网络通信框架networkcomms内核解析之十一 TCP连接与UDP连接

连接是通信的核心 客户端一般只会有一个连接 服务器端会维护成千上万的连接 在服务器端连接的维护工作是由NetworkComms静态类来完成的,当有新的客户端请求,服务器上会创建相应的连接,并把连接注册到NetworkComms静态类中.当连接断开后,NetworkComms通信框架会自动把相应连接的引用从NetworkComms静态类中删除. 连接的类图: 在V3以上版本中,数据监听部分已从Connnection类中提取出去成为一个单独的类: TCPConnectionListener   ,使

基于Socket的UDP和TCP编程介绍

一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流,TCP套接口是字节流套接口(streamsocket)的一种. UDP:用户数据报协议.UDP是一种无连接协议.UDP套接口是数据报套接口(datagram socket)的一种. 二.TCP和UDP介绍 1)基本TCP客户—服务器程序设计基本框架 说明:(三路握手)         1.客户端发

Poco库网络模块例子解析1-------字典查询

Poco的网络模块在Poco::Net名字空间下定义   下面是字典例子解析 #include "Poco/Net/StreamSocket.h" //流式套接字 #include "Poco/Net/SocketStream.h" //套接字流 #include "Poco/Net/SocketAddress.h" //套接字地址 #include "Poco/StreamCopier.h" //流复制器 #include

基于android的Socket通信

一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信.通过建立sock