簡體   English   中英

通過 Socket Outputstream 從 Swift 客戶端向 Java 服務器發送消息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM