简体   繁体   中英

WinRT - TCP clients?

I am building an IRC client in the new WinRT (.NET 4.5 ) framework for Windows 8 Metro applications.

However, I have some issues. I've already figured out that I need to use a StreamSocket to read TCP data, but I may be doing something wrong.

The reason I believe this is because I am not receiving any data.

Below you see my code. I haven't been able to find any code samples on the web regarding this.

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

Data is always an empty string following that code. Furthermore, UnconsumedBufferLength always returns 0.

How come?

You need to tell the DataReader to read bytes from the stream before you interpret them ( ReadString just interprets the bytes already read).

So, if you want to read a string of 20 bytes, do this:

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

If you want to read a string up to 20 bytes, do this:

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

See this video for more info: http://channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-580T

Note that DataReader does not give you message boundaries; it's just a more convenient way of waiting for and reading binary data from a stream. You still need message framing .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM