轉載自: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/
