正如标题所说,我在仅使用本机库将Swift Client连接到Java Server时遇到了一些问题。
现在,我有一个Java(客户端(到Java(服务器(的连接,它可以完美地工作,还有一个Swift(客户端(和Java(服务(的连接。我的Swift客户端确实连接到了Java服务器(它显示在控制台上(,但我的服务器的readFully挂起了——我唯一看到的是控制台上巨大的消息长度,几乎就是这样
Swift代码(发送(:
func send(message: String) {
let data = "msg:(message)".data(using: .utf8)!
data.withUnsafeBytes {
guard let pointer = $0.baseAddress?.assumingMemoryBound(to: UInt8.self) else {
print("Error joining chat")
return
}
out!.write(pointer, maxLength: data.count)
}
}
Java服务器(已读(:
int lenght = in.readInt();
System.out.println("Message: " + lenght);
if(length>0){
byte[] message = new byte[length];
in.readFully(message), 0, message.length); //This is where the problem is
}
因此,基本上Java服务器挂在readFully方法上。有什么想法吗?无论我发送一个简单的String还是Byte数组,它总是挂起,而且由于某种原因,长度非常大。有人能帮我理解我做错了什么吗?因为我已经在这件事上呆了好几天了,但仍然不明白(对斯威夫特来说还是很新鲜(。
非常感谢!
在Java代码中,您希望前4个字节是消息的长度,但在Swift代码中,没有首先发送消息的长度。您直接发送了消息本身。因此,现在Java代码对为什么消息比预期的要短感到困惑,并等待读取更多数据。
您可以尝试先发送data
中的字节数:
let byteCountAsByteArray = withUnsafeBytes(of: Int32(data.count).bigEndian, Array.init)
out!.write(byteCountAsByteArray, maxLength: 4)
out!.write(pointer, maxLength: data.count)
我怀疑您在Java代码中使用了一个DataInputStream
,因此使用了.bigEndian
。但是,如果您是以一种小的endian方式阅读这篇文章,请使用.littleEndian
。