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 в первой транзакции. Затем вам нужно передать этот байтовый массив без изменений во второй транзакции. Попытайся.