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

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

编辑1:

这是@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)构造UInt32时,错误是:无法找到接受提供的参数的'init'的重载。

  • 感谢您的帮助!

    最佳答案

    我自己想通了,对于那些想要解释的人,请先阅读。

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

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

    NSStream类具有一个称为 getStreamsToHost 的静态方法(快速的类函数)。
    您需要准备的是使用实际主机地址,端口号,对NSInputStream obj的引用以及对NSOutputStream obj进行初始化的NSHost对象。
    然后,您可以使用此处显示的流,并在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!”。并打开 socket 进行通讯。
    Jonathans-MacBook-Air:~ johni$ ncat -l 4000
    Hello !
    Jonathan Yaniv.
    Jonathans-MacBook-Air:~ johni$
    

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

    我希望这可以使您中的一些人头疼。
    如果您还有其他问题,请尝试一下。

    这篇文章中说明了&符号。 (Reference to NSInputStream read use)

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

    10-12 00:27
    查看更多