2011-09-29 10 views
8

Je construis un client IRC dans la nouvelle structure WinRT (.NET 4.5) pour les applications Windows 8 Metro.WinRT - Clients TCP?

Cependant, j'ai quelques problèmes. J'ai déjà compris que je devais utiliser un StreamSocket pour lire les données TCP, mais je peux faire quelque chose de mal.

La raison pour laquelle je crois que c'est parce que je ne reçois aucune donnée.

Ci-dessous vous voyez mon code. Je n'ai pas été en mesure de trouver des exemples de code sur le web à ce sujet.

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

Les données sont toujours une chaîne vide suivant ce code. En outre, UnconsumedBufferLength renvoie toujours 0.

Comment?

+0

pensée aléatoire; avez-vous essayé les méthodes asynchrones? peut-être qu'ils veulent utiliser async? –

+1

Oui, rien n'est encore reçu au moment de la connexion. Vous allez devoir appeler ReadAsync() sur le InputStream. –

+0

Désolé, juste une supposition cul sauvage, mais n'est pas IRC nécessite une connectivité UDP multicast? – Haspemulator

Répondre

9

Vous devez indiquer au DataReader de lire les octets du flux avant de les interpréter (ReadString interprète simplement les octets déjà lus).

Donc, si vous voulez lire une chaîne de 20 octets, procédez comme suit:

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

Si vous voulez lire une chaîne jusqu'à 20 octets, faites ceci:

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

Voir cette vidéo pour plus d'informations: http://channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-580T

Notez que DataReader ne vous donne pas les limites de message; C'est juste un moyen plus pratique d'attendre et de lire les données binaires d'un flux. Vous avez toujours besoin de message framing.

+0

Notez également que LoadAsync là avec l'indicateur Partial peut retourner dès qu'il y a 1 octet disponible, alors UnconsumedBufferLength peut être inférieur à la longueur totale de la chaîne. – chrisvarnz