2016-06-20 121 views
1

我正在嘗試在Android和Windows 10設備之間創建一個聊天應用程序。 我已經使用DataOutputStream從Android成功發送了文本,並使用數據讀取器類在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");// 
} 

數據通過datawriter從Windows發送:

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是windows uwp中的writer類。我正在寫這個工作到一個文本框 – harishdvvvvv

回答

0

您的dIn.readFully預計字節而不是String。此外,它期望確切的字節數,因爲length變量。您需要在窗口大小上從字符串創建字節,並在第一個事務中將字節數組的長度作爲Int發送至。然後你需要在第二個事務中不改變這個字節數組。嘗試一下。

+0

中的東西,我也嘗試使用writer.writebytes(coneverted_bytes_of_string)作爲字節從窗口發送..但沒有工作 – harishdvvvvv