DataInputStream зависает при чтении

Я пытаюсь создать приложение чата между Android и устройством Windows 10. Я успешно отправил текст из Android, используя DataOutputStream и прочитать его в 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 ответ

Ваш dIn.readFully ожидает байтов а не String, Более того, он ожидает точное количество байтов, так как length переменная. Вам необходимо создать байты из String для размера окна и отправить длину байтового массива как Int в первой транзакции. Затем вам нужно передать этот байтовый массив без изменений во второй транзакции. Попытайся.

Другие вопросы по тегам