web-dev-qa-db-ja.com

Swift Javaのように)でソケットを使用する

サーバーに接続したい場合は、Javaで、ソケットを開いてポートとホストアドレスで初期化し、入力/出力ストリームを取得して、必要なものを読み取り/書き込みします。

In Swiftそのように構築されていないため、そうするのに苦労しています。サーバーに接続し、ストリームを取得して使用する方法の簡単な例を本当に見たいと思います。

編集1:

これは、@ Grimxnが参照した後にテストされたコードです。

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

主な問題:

  1. 上記の2つのストリームを初期化するには、CFAllocatorを使用する必要がありますが、これについては何も知りません。 kCFAllocatorDefaultを使用しても、まったく役に立ちませんでした。同じエラーが発生しました。

  2. 上記のコードはこのエラーを返します:式のタイプ 'Void'をタイプUInt32に変換できません

  3. たとえば、UInt32(80)を使用してUInt32を構築すると、エラーは次のようになります。提供された引数を受け入れる 'init'のオーバーロードを見つけることができませんでした

助けてくれてありがとう!

12
johni

先に読んだ説明を探す人のために、私はそれを自分で考えました。

ソケットを使用してローカルアプリケーションまたはリモートサーバーと通信する方法は複数あります。

元の投稿で説明されている問題は、入力/出力ストリームを取得して機能させることでした。 (この投稿の最後に、これらのストリームの使用方法を説明する別の投稿への参照があります)

NSStreamクラスには、getStreamsToHostという静的メソッド(Swiftのクラス関数)があります。準備する必要があるのは、実際のホストアドレス、ポート番号、NSInputStream objへの参照、およびNSOutputStream objで初期化されたNSHostオブジェクトです。次に、ここに示され、 参照投稿 で説明されているストリームを使用できます。

この単純なコードを見てください。

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読み取り使用への参照)

29
johni