2017-10-12 8 views
0

J'essaie de me connecter à la socket wss, et le nom d'hôte ressemble à ceci: "myhostname.com/ws/v2". Voici comment je commence la connexion:Comment se connecter à une socket wss où le nom d'hôte a un chemin supplémentaire en utilisant NSStream?

let host = "myhostname.com/ws/v2" 

CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host as CFString, 443, &readStream, &writeStream) 

inputStream = readStream!.takeRetainedValue() 
outputStream = writeStream!.takeRetainedValue() 

outputStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL, forKey: Stream.PropertyKey.socketSecurityLevelKey) 
inputStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL, forKey: Stream.PropertyKey.socketSecurityLevelKey) 

inputStream.schedule(in: .current, forMode: .commonModes) 
outputStream.schedule(in: .current, forMode: .commonModes) 

inputStream.delegate = self 
outputStream.delegate = self 

inputStream.open() 
outputStream.open() 

Cela échoue avec une erreur: The operation couldn’t be completed. (kCFErrorDomainCFNetwork error 1.)

Cependant, si je retire le chemin du nom d'hôte, de sorte qu'il ressemble à ceci: myhostname.com alors dans mon délégué je reçois un événement openCompleted. Cependant, il ne répond pas à mes messages après cela, je suppose que c'est parce que je suis connecté à une mauvaise socket, puisque j'ai supprimé le chemin.

Quelle est la bonne façon de se connecter à une socket lorsque le nom d'hôte a un chemin supplémentaire?

Répondre

0

myhostname.com/ws/v2 n'est pas un nom d'hôte. C'est une URL (incomplète) (l'URL complète est wss://myhostname.com/ws/v2). Le nom d'hôte est juste myhostname.com, et le chemin Websocket sur cet hôte est juste /ws/v2. Le protocole de connexion WebSockets utilise HTTP/S, il ne suffit donc pas de se connecter à l'hôte avec NSStream. Vous devez connecter un socket TCP au port host, puis négocier une négociation SSL/TLS si vous utilisez WSS, puis utiliser HTTP pour demander le path demandant un Upgrade à WebSocket, et seulement si une réponse HTTP 101 réussie est renvoyée puis effectuez la prise de contact WebSocket.

C'est beaucoup de travail à faire manuellement. Vous devriez vraiment utiliser une bibliothèque client WebSocket réelle à la place. Il y a beaucoup disponible.