2011-09-29 152 views
8

我在Windows 8 Metro應用程序的新WinRT (.NET 4.5)框架中構建IRC客戶端。WinRT - TCP客戶端?

但是,我有一些問題。我已經發現我需要使用StreamSocket來讀取TCP數據,但我可能做錯了什麼。

我相信這是因爲我沒有收到任何數據。

下面你看到我的代碼。我一直無法在網上找到任何關於此的代碼示例。

class IRCClient 
{ 
    private StreamSocket tcpClient; 
    public string Server = "holmes.freenode.net"; 
    public int Port = 6665; 

    public IRCClient() 
    { 
     tcpClient = new StreamSocket(); 
    } 

    public async void Connect() 
    { 
     await tcpClient.ConnectAsync(
         new Windows.Networking.HostName(Server), 
         Port.ToString(), 
         SocketProtectionLevel.PlainSocket); 

     DataReader reader = new DataReader(tcpClient.InputStream); 
     string data = reader.ReadString(reader.UnconsumedBufferLength); 

     MessageDialog dialog = new MessageDialog(data);    
    } 
} 

數據總是以下代碼空字符串。此外,UnconsumedBufferLength總是返回0.

怎麼回事?

+0

隨機想法;你有沒有嘗試過異步方法?也許他們想使用異步? –

+1

是的,在連接時沒有收到任何信息。你將不得不在InputStream上調用ReadAsync()。 –

+0

對不起,只是一個瘋狂的猜測,但不是IRC需要多播UDP連接? – Haspemulator

回答

9

您需要告訴DataReader在解釋它們之前先從流中讀取字節(ReadString只是解釋已讀取的字節)。

所以,如果你想讀的20個字節的字符串,這樣做:如果你想讀一個字符串高達 20字節

DataReader reader = new DataReader(tcpClient.InputStream); 
await reader.LoadAsync(20); 
string data = reader.ReadString(reader.UnconsumedBufferLength); 

,這樣做:

DataReader reader = new DataReader(tcpClient.InputStream); 
reader.InputStreamOptions = InputStreamOptions.Partial; 
await reader.LoadAsync(20); 
string data = reader.ReadString(reader.UnconsumedBufferLength); 

請參閱此視頻以瞭解更多信息:http://channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-580T

請注意,DataReader不會給您留言邊界;它只是一個更方便的方式來等待和讀取流中的二進制數據。你仍然需要message framing

+0

另請注意,帶有部分標誌的LoadAsync只要有1個字節可用就可以返回,因此UnconsumedBufferLength可能小於字符串的總長度。 – chrisvarnz