2016-06-20 3 views
1

Я пытаюсь создать приложение чата между Android и устройством Windows 10. Я успешно отправил текст с Android с помощью DataOutputStream и прочитал его в Windows 10 с использованием класса чтения данных.DataInputStream зависает при чтении

Моя проблема - 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(); 
} 

Что такое проблема здесь?

+0

Являются ли размеры окон для записи Int первой транзакцией? –

+0

Что такое 'DataWriter', и почему вы не используете' DataOutputStream' для дополнения своего 'DataInputStream' и где вы пишете слово длины, которое вы читаете, и где это вызов' available() ' что вы описываете? – EJP

+0

@EJP: Datawriter - это класс потока записи в окнах uwp. Я пишу работу в текстовое поле – harishdvvvvv

ответ

0

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

+0

, я также попытался отправить в виде байтов из окон с помощью writer.writebytes (coneverted_bytes_of_string) .. но не работал – harishdvvvvv

Смежные вопросы