2011-09-29 18 views
8

Sto costruendo un client IRC nel nuovo framework WinRT (.NET 4.5 per applicazioni Windows 8 Metro.WinRT - Client TCP?

Tuttavia, ho alcuni problemi. Ho già capito che ho bisogno di usare uno StreamSocket per leggere i dati TCP, ma potrei fare qualcosa di sbagliato.

La ragione per cui credo sia perché non sto ricevendo alcun dato.

Qui sotto vedi il mio codice. Non sono stato in grado di trovare campioni di codice sul web per quanto riguarda questo.

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);    
    } 
} 

I dati sono sempre una stringa vuota che segue quel codice. Inoltre, UnconsumedBufferLength restituisce sempre 0.

Come mai?

+0

pensiero casuale; hai provato i metodi asincroni? forse vogliono usare async? –

+1

Sì, non viene ancora ricevuto nulla al momento della connessione. Dovrai chiamare ReadAsync() su InputStream. –

+0

Mi spiace, solo una supposizione selvaggia, ma l'IRC non richiede connettività UDP multicast? – Haspemulator

risposta

9

È necessario comunicare allo DataReader byte dal flusso prima di interpretarli (ReadString interpreta solo i byte già letti).

Quindi, se volete leggere una stringa di 20 byte, fare questo:

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

Se si vuole leggere una stringa fino a 20 byte, fare questo:

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

Vedere questo video per maggiori informazioni: http://channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-580T

Si noti che DataReader non fornisce i limiti del messaggio; è solo un modo più conveniente di aspettare e leggere i dati binari da un flusso. Hai ancora bisogno di message framing.

+0

Si noti inoltre che LoadAsync con il flag Parziale può tornare non appena c'è 1 byte disponibile, quindi UnconsumedBufferLength potrebbe essere inferiore alla lunghezza totale della stringa. – chrisvarnz