[英]Send message through Socket Outputstream from Swift Client to Java Server
正如標題所說,我在僅使用本機庫將 Swift 客戶端連接到 Java 服務器時遇到了一些問題。
現在我有一個 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 方法上。 任何想法為什么會這樣? 無論我發送一個簡單的字符串還是字節數組,它總是掛起,並且由於某種原因長度非常大。 有人可以幫我理解我做錯了什么,因為我已經在這個問題上做了好幾天但仍然不理解它(對 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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.