Używanie gniazd w Swift jak w Javie

Gdybym chciał połączyć się z serwerem, w Javie otworzyłbym gniazdo i zainicjalizowałby je za pomocą portu i adresu hosta, a następnie pobierał strumienie wejścia/wyjścia i odczytywał / zapisywał, co tylko zechcę.

W Swifcie ciężko mi to zrobić, ponieważ nie jest zbudowany w ten sposób i naprawdę chciałbym zobaczyć prosty przykład, jak połączyć się z serwerem, pobrać strumienie i używać ich.

EDIT1:

To jest testowany kod po tym co @ Grimxn / align = "left" /

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

Główne zagadnienia:

  1. Inicjalizacja obu powyższych strumieni wymaga również użycia Cfallocatora , o którym nic nie wiem. Użycie kCFAllocatorDefault nie bardzo pomogło, same błędy.

  2. Powyższy kod zwraca ten błąd: nie można przekonwertować typu wyrażenia "Void" Na Typ UInt32.

  3. Kiedy konstruuję UInt32 używając UInt32(80) na przykład błąd jest: nie można znaleźć przeciążenia dla 'init', który akceptuje podany argument.

Doceniam każdą pomoc!
Author: johni, 2014-07-21

1 answers

Sam to wymyśliłem, dla tych, którzy szukają wyjaśnienia Czytaj dalej;

Istnieje wiele sposobów używania gniazd do komunikacji z lokalną aplikacją lub zdalnym serwerem.

Problem opisany w oryginalnym poście polegał na pobraniu strumieni wejścia/wyjścia i uruchomieniu ich do pracy. (na końcu tego postu jest odniesienie do innego mojego postu wyjaśniającego, jak korzystać z tych strumieni)

Klasa NSStream posiada metodę statyczną (funkcja klasy w języku swift) zwany getStreamsToHost. Wszystko, co musisz przygotować, to nshost zainicjalizowany z rzeczywistym adresem hosta, numerem portu, odniesieniem do nsinputstream obj, a także do nsoutputstream obj. Następnie możesz użyć strumieni, jak pokazano tutaj i wyjaśniono w punkcie odniesienia .

Spójrz na ten prosty kod;

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)

Przed wykonaniem tego prostego kodu uruchomiłem ncat, aby nasłuchać na porcie 4000 W moim terminalu i wpisałem " Hello !"and left the Gniazdo otwarte do komunikacji.

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

Po uruchomieniu kodu widać, że otrzymałem ciąg znaków " Jonathan Yaniv.\n " do terminala przed zamknięciem gniazda.

Mam nadzieję, że to oszczędzi wam bólu głowy. Jeśli masz więcej pytań, spróbuj, mam nadzieję, że będę w stanie odpowiedzieć.

& notacja jest wyjaśniona w tym poście. (odniesienie do nsinputstream read use)

 29
Author: johni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:17