我正在尝试在Android和Windows 10设备之间创建聊天应用程序。
我已成功使用DataOutputStream
从Android发送文本,并使用数据读取器类在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();
}
这里有什么问题?
答案 0 :(得分:0)
您的dIn.readFully
期望字节而不是String
。此外,它期望精确字节数,作为length
变量。您需要在窗口大小上从String创建字节,并在第一个事务中将字节数组的长度作为Int发送。然后,您需要在第二个事务中传输此字节数组。试试吧。