DataInputStream在读取时挂起

时间:2016-06-20 11:12:49

标签: android sockets windows-10-universal datainputstream

我正在尝试在Android和Windows 10设备之间创建聊天应用程序。 我已成功使用DataOutputStream从Android发送文本,并使用数据读取器类在Windows 10中读取它。

我的问题是Android无法识别Windows中的文本。它会显示datainputstream.available()函数的结果,但如果我使用readString()readbyte()函数,应用程序会挂起。

Android中用于接收的代码:

DataInputStream  dIn = new DataInputStream(clientSocket.getInputStream());
if(dIn.available()>0)
{
    int length = dIn.readInt();  // app hangs in here
    byte[] byteReceived = new byte[length];
    dIn.readFully(byteReceived, 0 , length); // sometimes app hangs here 
    String textReceived = new String(byteReceived);
    text.setText(Client Says: "+ textReceived + "\n");//
}

从Windows通过datawriter发送的数据:

DataWriter writer = new DataWriter(socket.OutputStream))
{
    writer.UnicodeEncoding=windows.Storage.Streams.UnicodeEncoding.Utf8;
    writer.ByteOrder = windows.Storage.Streams.ByteOrder.LittleEndian;
    uint size =writer.MeasureString(message); 
    writer.WriteUint32(size);
    writer.WriteString(message);
    try
    {
        await writer.StoreAsync();
    }
    catch (Exception exception)
    {
        switch (SocketError.GetStatus(exception.HResult))
        {
            case SocketErrorStatus.HostNotFound:
                // Handle HostNotFound Error
                throw;
            default:
                throw;
        }
    }

    await writer.FlushAsync();
    writer.DetachStream();
}

这里有什么问题?

1 个答案:

答案 0 :(得分:0)

您的dIn.readFully期望字节而不是String。此外,它期望精确字节数,作为length变量。您需要在窗口大小上从String创建字节,并在第一个事务中将字节数组的长度作为Int发送。然后,您需要在第二个事务中传输此字节数组。试试吧。

相关问题