gpt4 book ai didi

sockets - 像在 Java 中一样在 Swift 中使用套接字

转载 作者:IT王子 更新时间:2023-10-29 05:25:25 25 4
gpt4 key购买 nike

如果我想连接到服务器,在 Java 中我会打开一个套接字并使用端口和主机地址对其进行初始化,然后检索输入/输出流并读取/写入任何我想要的内容。

在 Swift 中,我很难做到这一点,因为它不是以这种方式构建的,我真的很想看到一个简单的示例,说明如何连接到服务器、检索流并使用它们。

编辑1:

这是@Grimxn 引用后的测试代码。

var host = "http://google.com"
var readStream :CFReadStreamRef
var writeStream :CFWriteSteamRef
var socket = CFStreamCreatePairWithSocketToHost(nil, host, 80, readStream, writeStream)

主要问题:

  1. 初始化上面的两个流还需要使用CFAllocator,我对此一无所知。使用 kCFAllocatorDefault 并没有多大帮助,同样的错误。

  2. 以上代码返回此错误:无法将表达式的类型“Void”转换为类型 UInt32

  3. 例如,当我使用 UInt32(80) 构建 UInt32 时,错误是:Could not find overload for ' init' 接受提供的参数。

感谢您的帮助!

最佳答案

我自己想出来了,对于那些寻找解释的人请提前阅读;

有多种方法可以使用套接字与本地应用程序或远程服务器进行通信。

原帖中描述的问题是获取输入/输出流并让它们工作。 (在这篇文章的末尾有对我的另一篇文章的引用,解释了如何使用这些流)

NSStream 类有一个名为 getStreamsToHost 的静态方法(swift 中的类函数)。您需要准备的只是一个 NSHost 对象,该对象使用真实的主机地址、端口号、对 NSInputStream obj 的引用以及 NSOutputStream obj 进行初始化。然后,您可以使用此处显示并在 reference post 中解释的流.

看看这个简单的代码;

let addr = "127.0.0.1"
let port = 4000

var host :NSHost = NSHost(address: addr)
var inp :NSInputStream?
var out :NSOutputStream?

NSStream.getStreamsToHost(host, port: port, inputStream: &inp, outputStream: &out)

let inputStream = inp!
let outputStream = out!
inputStream.open()
outputStream.open()

var readByte :UInt8 = 0
while inputStream.hasBytesAvailable {
inputStream.read(&readByte, maxLength: 1)
}

// buffer is a UInt8 array containing bytes of the string "Jonathan Yaniv.".
outputStream.write(&buffer, maxLength: buffer.count)

在执行这个简单的代码之前,我启动了 ncat 以在我的终端中监听端口 4000 并键入“Hello!”并保持套接字打开以进行通信。

Jonathans-MacBook-Air:~ johni$ ncat -l 4000
Hello !
Jonathan Yaniv.
Jonathans-MacBook-Air:~ johni$

启动代码后,您可以看到在套接字关闭之前,我已将字符串“Jonathan Yaniv.\n”接收到终端。

我希望这能减轻你们中的一些人的头痛。如果您有更多问题,请尝试一下,希望我能够回答。

& 符号在这篇文章中进行了解释。 (Reference to NSInputStream read use)

关于sockets - 像在 Java 中一样在 Swift 中使用套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24863550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com