通过套接字输出流从 Swift 客户端向 Java 服务器发送消息
Send message through Socket Outputstream from Swift Client to Java Server
如标题所述,我在仅使用本机库将 Swift 客户端连接到 Java 服务器时遇到了一些问题。
现在我有一个 Java(client) 到 Java(server) 的连接,可以正常工作,还有一个 Swift(client) 到 Java(服务器)连接。我的 Swift 客户端确实连接到 Java 服务器(它显示在控制台上),但是我的服务器的 readFully 挂起 - 我唯一看到的是控制台上的巨大消息长度,这几乎是它。
Swift代码(发送):
func send(message: String) {
let data = "msg:\(message)".data(using: .utf8)!
data.withUnsafeBytes {
guard let pointer = [=12=].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 数组,它总是挂起,并且由于某种原因,长度非常大。有人可以帮助我理解我做错了什么,因为我已经解决了好几天但仍然不理解它(对 Swift 还是很陌生)。
非常感谢!
在您的 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
。但是,如果您以小端方式阅读本文,请改用 .littleEndian
。
如标题所述,我在仅使用本机库将 Swift 客户端连接到 Java 服务器时遇到了一些问题。
现在我有一个 Java(client) 到 Java(server) 的连接,可以正常工作,还有一个 Swift(client) 到 Java(服务器)连接。我的 Swift 客户端确实连接到 Java 服务器(它显示在控制台上),但是我的服务器的 readFully 挂起 - 我唯一看到的是控制台上的巨大消息长度,这几乎是它。
Swift代码(发送):
func send(message: String) {
let data = "msg:\(message)".data(using: .utf8)!
data.withUnsafeBytes {
guard let pointer = [=12=].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 数组,它总是挂起,并且由于某种原因,长度非常大。有人可以帮助我理解我做错了什么,因为我已经解决了好几天但仍然不理解它(对 Swift 还是很陌生)。
非常感谢!
在您的 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
。但是,如果您以小端方式阅读本文,请改用 .littleEndian
。