转载自: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/