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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM