8

(.NET 4.5Windows 8 Metro アプリケーション用の新しい WinRT ) フレームワークで IRC クライアントを構築しています。

ただし、いくつか問題があります。TCP データを読み取るために a を使用する必要があることはすでにわかっていますStreamSocketが、何か間違っている可能性があります。

私がこれを信じる理由は、データを受け取っていないからです。

以下に私のコードを示します。これに関するウェブ上のコードサンプルを見つけることができませんでした。

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 を返します。

どうして?

4

1 に答える 1

9

DataReaderを解釈する前に、ストリームからバイトを読み取るように指示する必要があります(ReadStringすでに読み取られたバイトを解釈するだけです)。

したがって、20バイトの文字列を読み取りたい場合は、次のようにします。

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

20バイトまでの文字列を読み取りたい場合は、次のようにします。

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これはメッセージの境界を与えるものではないことに注意してください。これは、ストリームを待機してバイナリデータを読み取るためのより便利な方法です。あなたはまだメッセージフレーミングが必要です。

于 2011-09-29T13:48:14.017 に答える