2011-09-29 25 views
8

Tôi đang xây dựng một ứng dụng IRC trong khung công tác WinRT (.NET 4.5) mới cho các ứng dụng Windows 8 Metro.WinRT - TCP clients?

Tuy nhiên, tôi có một số vấn đề. Tôi đã tìm ra rằng tôi cần phải sử dụng StreamSocket để đọc dữ liệu TCP, nhưng tôi có thể đang làm điều gì đó sai.

Lý do tôi tin rằng điều này là do tôi không nhận được bất kỳ dữ liệu nào.

Dưới đây bạn sẽ thấy mã của tôi. Tôi đã không thể tìm thấy bất kỳ mẫu mã nào trên web liên quan đến điều này.

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

Dữ liệu luôn là một chuỗi rỗng sau mã đó. Hơn nữa, UnconsumedBufferLength luôn trả về 0.

Làm thế nào?

+0

suy nghĩ ngẫu nhiên; bạn đã thử các phương thức async chưa? có lẽ họ muốn sử dụng async? –

+1

Có, không có gì được nhận vào thời điểm kết nối được thực hiện. Bạn sẽ phải gọi ReadAsync() trên InputStream. –

+0

Xin lỗi, chỉ là một giả định hoang dã, nhưng không phải IRC yêu cầu kết nối UDP đa hướng? – Haspemulator

Trả lời

9

Bạn cần phải thông báo cho số DataReader để đọc byte từ luồng trước khi bạn diễn giải chúng (ReadString chỉ diễn giải các byte đã đọc).

Vì vậy, nếu bạn muốn đọc một chuỗi 20 byte, làm điều này:

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

Nếu bạn muốn đọc một chuỗi lên đến 20 byte, làm điều này:

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

Xem video này để biết thêm thông tin: http://channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-580T

Lưu ý rằng DataReader không cung cấp cho bạn ranh giới thông báo; nó chỉ là một cách thuận tiện hơn để chờ đợi và đọc dữ liệu nhị phân từ một luồng. Bạn vẫn cần message framing.

+0

Cũng lưu ý rằng LoadAsync ở đó với cờ một phần có thể trở lại ngay khi có sẵn 1 byte, vì vậy UnconsumedBufferLength có thể có ít hơn tổng chiều dài của chuỗi. – chrisvarnz