通过Socket Outputstream从Swift客户端向Java服务器发送消息



正如标题所说,我在仅使用本机库将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

最新更新