2011-09-29 24 views
8

Estoy creando un cliente de IRC en el nuevo marco de WinRT (.NET 4.5) para las aplicaciones de Metro de Windows 8.WinRT - clientes TCP?

Sin embargo, tengo algunos problemas. Ya he descubierto que necesito usar un StreamSocket para leer datos TCP, pero puedo estar haciendo algo mal.

La razón por la que creo esto es porque no recibo ningún dato.

A continuación, vea mi código. No he podido encontrar ningún ejemplo de código en la web con respecto a esto.

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

Los datos son siempre una cadena vacía siguiendo ese código. Además, UnconsumedBufferLength siempre devuelve 0.

¿Cómo es posible?

+0

pensamiento aleatorio; ¿Has probado los métodos asíncronos? tal vez ellos quieren usar asincrónico? –

+1

Sí, no se recibió nada aún cuando se realizó la conexión. Tendrás que llamar a ReadAsync() en InputStream. –

+0

Lo siento, solo una conjetura salvaje, pero ¿no es IRC requiere conectividad UDP multicast? – Haspemulator

Respuesta

9

Debe indicar DataReader para leer los bytes de la secuencia antes de interpretarlos (ReadString solo interpreta los bytes ya leídos).

lo tanto, si desea leer una cadena de 20 bytes, hacer esto:

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

Si desea leer una cadena hasta 20 bytes, hacer esto:

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

Vea este video para más información: http://channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-580T

Tenga en cuenta que DataReader no le da límites de mensajes; es solo una manera más conveniente de esperar y leer datos binarios de una transmisión. Aún necesita message framing.

+0

También tenga en cuenta que LoadAsync allí con el indicador Parcial puede regresar tan pronto como haya 1 byte disponible, por lo que UnconsumedBufferLength podría ser menor que la longitud total de la cadena. – chrisvarnz