【问题标题】:Send message through Socket Outputstream from Swift Client to Java Server通过 Socket Outputstream 从 Swift 客户端向 Java 服务器发送消息
【发布时间】:2023-04-03 07:39:01
【问题描述】:

正如标题所说,我在仅使用本机库将 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 来说仍然很新)。

非常感谢!

【问题讨论】:

  • @Sweeper 这是一个很好的收获!关于如何先发送消息长度然后只发送消息的任何想法?

标签: java swift sockets inputstream outputstream


【解决方案1】:

在您的 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

【讨论】:

  • 是的!正是这个!是的,正如你所猜测的那样使用 DataInputStream 。现在工作得很好!非常感谢!
  • @JCCA 如果write 写入套接字,很可能并非所有字节都会被写入。因此,由于它实际上是一个套接字,因此您的代码必须进行更改才能正常工作 - 除非您已经以阻塞线程并在后台处理此问题的方式实现了 write - 这不是一个好的解决方案,不过。
  • @CouchDeveloper 有哪些变化?它确实写入了一个套接字,但从我从双方看到的情况来看,双方的消息是相同的,所以我想一切都很好。但我并不是这方面的专家!谢谢!
  • @JCCA 这个看似简单的写入流的任务实际上比我们写入文件要复杂得多(我们可以肯定,所有字节都将在通常情况下写入) - 相反的一个插座。我建议寻找可以作为解决方案使用的 NSStream 编程指南和示例代码。还研究了文件描述符的一般工作方式(这都是 C 和 UNIX 的东西)。基本上,你的“写”API 会变成异步的,并且会返回错误。
  • @CouchDeveloper 明白了!感谢您的意见,非常感谢!
猜你喜欢
  • 2013-11-10
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 2015-04-25
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多