如果我想连接到服务器,在Java中我会打开一个Socket并初始化它的端口和主机地址,然后检索输入/输出流和读/写任何我想要的。
在Swift中,我很难做到这一点,因为它不是这样构建的,我真的很想看到一个简单的例子,如何连接到服务器,检索流并使用它们。
EDIT1:
这是@Grimxn引用后的测试代码。
var host = "http://google.com"
var readStream :CFReadStreamRef
var writeStream :CFWriteSteamRef
var socket = CFStreamCreatePairWithSocketToHost(nil, host, 80, readStream, writeStream)
主要问题:初始化上面的两个流也需要使用CFAllocator,我对此一无所知。使用kCFAllocatorDefault没有太大帮助,同样的错误。
上面的代码返回这个错误:不能将表达式的类型'Void'转换为类型UInt32
当我使用UInt32(80)例如,错误是:无法找到'init'的过载接受提供的参数。
谢谢你的帮助!
我自己已经算出来了,对于那些想要解释的人,请提前阅读;
使用套接字与本地应用程序或远程服务器通信有多种方式。
原始帖子中描述的问题是获取输入/输出流并使其工作。
(在这篇文章的末尾有一个参考,我的另一篇文章解释了如何使用这些流) NSStream类有一个静态方法(swift中的类函数)叫做getStreamsToHost。所有你需要准备的是一个NSHost对象初始化为一个真实的主机地址,一个端口号,一个对NSInputStream对象的引用,还有一个NSOutputStream对象的引用。然后,您可以使用这里所示的流,并在参考文章中解释。看看这段简单的代码;
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"到终端,
我希望这为你们中的一些人节省了一些头痛。如果你有更多的问题,请试一试,我希望我能回答你。
和;这篇文章解释了符号。(参考NSInputStream读取使用)