DataReader - 读取未知长度的数据

时间:2014-05-28 14:25:08

标签: c# windows-phone-8 datareader

我已经与Tomcat java服务器建立了连接。

发送登录数据后,服务器响应。 响应的长度未知。

所以我尝试使用DataReader.UnconsumedBufferLength读取字节数

DataReader din = new DataReader(socket.InputStream);
int i = 0;
byte[] b = new byte[64];
await din.LoadAsync(1);
while(din.UnconsumedBufferLength > 0)
{
    din.LoadAsync(1);
    b[i] = din.ReadByte();
    await din.LoadAsync(1)
    i++;
}

这种解决方案有点工作,我把消息放到字节数组中,但它远非理想。 相应的Java客户端使用这一小段代码

BufferedInputStream inFromServer = new BufferedInputStream(socket.getInputStream());
int read = 0;
byte[] result = new byte[100];    
read = inFromServer.read(result);

我希望在C#中有一个同样简单的解决方案......

2 个答案:

答案 0 :(得分:2)

如果您需要一个集合来存储未知长度的数据,您应该使用像List这样的通用集合:

DataReader din = new DataReader(socket.InputStream);

List<byte> _ByteList = new List<byte>();
await din.LoadAsync(1);
while(din.UnconsumedBufferLength > 0)
{
    din.LoadAsync(1);
    _ByteList.Add(din.ReadByte());
    await din.LoadAsync(1)
}

然后,如果您需要一个数组,请使用

byte [] _ByteArray = _ByteList.ToArray();

答案 1 :(得分:1)

在你发布的java代码的C#中绝对有一个简单的等价物。实际上,您目前正在使用的C#版本使用异步调用,这比对流的简单调用要复杂得多。如果您想在没有异步调用的情况下在C#中使用缓冲流,则可以只在流上Read。很简单:

socket.InputStream.Read()

在您的java代码中,您似乎使用大小为100的缓冲区来读取流。您只读取了100个字节的流,而不是一直到最后。如果这是你想要的,你可以做:

byte[] b = new byte[100];
int readTo = socket.InputStream.Read(b, 0, 100);

此外,如果您想一直走到最后,请使用Jon Skeet的回答here。它没有比这更好。

相关问题