2016-06-20 10 views
1

Ich versuche, eine Chat-Anwendung zwischen Android und einem Windows 10-Gerät zu erstellen. Ich habe erfolgreich Text von Android mit DataOutputStream gesendet und las es in Windows 10 mit einer Datenleserklasse.DataInputStream hängt beim Lesen

Mein Problem ist Android ist nicht in der Lage, den Text von Windows zu erkennen. Es zeigt das Ergebnis der datainputstream.available() Funktion, aber die Anwendung hängt, falls ich die readString() oder die readbyte() Funktion verwende.

-Code in Android für Empfang:

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");// 
} 

Daten von Windows über datawriter gesendet:

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(); 
} 

Was ist das Problem hier?

+0

Ist die Fenstergröße bei der ersten Transaktion Int schreiben? –

+0

Was ist ein 'DataWriter', und warum verwenden Sie nicht' DataOutputStream', um Ihren 'DataInputStream' zu ergänzen, und wo schreiben Sie das Längenwort, das Sie lesen, und wo ist der Aufruf von' available() ' Das beschreibst du? – EJP

+0

@EJP: DataWriter ist die Writer Stream-Klasse in Windows uwp. Ich schreibe die Arbeit in ein Textfeld – harishdvvvvv

Antwort

0

Ihre dIn.readFully erwartet Bytes und nicht String. Darüber hinaus erwartet es die genaue Anzahl der Bytes, wie length Variable. Sie müssen Bytes aus String in der Windows-Größe erstellen und die Länge des Bytearrays als Int in der ersten Transaktion senden. Dann müssen Sie dieses Byte-Array in der zweiten Transaktion unverändert übertragen. Versuch es.

+0

ich habe auch versucht, als Bytes aus Windows mit writer.writebytes (coneverted_bytes_of_string) .. aber nicht funktioniert – harishdvvvvv