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

joh*_*hni 12 sockets input stream output swift

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

在Swift中我很难这样做,因为它不是那样构建的,我真的希望看到一个如何连接到服务器,检索流并使用它们的简单示例.

EDIT1:

这是经过@Grimxn引用的测试代码.

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

主要问题:

  1. 初始化上面的两个流也需要使用我一无所知的CFAllocator.使用kCFAllocatorDefault没有太大帮助,相同的错误.

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

  3. 例如,当我使用UInt32(80)构造UInt32时,错误是:找不到接受所提供参数的'init'的重载.

我感谢任何帮助!

joh*_*hni 29

我自己已经想到了,因为那些寻求解释的人会提前阅读;

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

原帖中描述的问题是获取输入/输出流并使它们工作.(在这篇文章的最后,有一篇关于我的另一篇文章的参考资料,解释了如何使用这些流)

NSStream类有称为静态方法(在迅速类的函数)getStreamsToHost.所有你必须准备的是一个NSHost对象,用一个真实的主机地址,一个端口号,一个NSInputStream obj的引用以及一个NSOutputStream obj初始化.然后,您可以使用此处显示的流并在参考文章中进行说明.

看看这个简单的代码;

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)
Run Code Online (Sandbox Code Playgroud)

在执行这个简单的代码之前,我启动了ncat来监听终端中的端口4000并输入"Hello!" 然后打开插座进行通信.

Jonathans-MacBook-Air:~ johni$ ncat -l 4000
Hello !
Jonathan Yaniv.
Jonathans-MacBook-Air:~ johni$ 
Run Code Online (Sandbox Code Playgroud)

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

我希望这给你们中的一些人带来了一些麻烦.如果你有更多问题请试一试,我希望我能够回答它.

这篇文章解释了&符号. (参考NSInputStream读取使用)

  • 请注意,不推荐使用getStreamsToHost(_:port:inputStream:outputStream :).请改用getStreamsToHostWithName("127.0.0.1",port:port,inputStream:&inp,outputStream:&out). (4认同)