2017-10-12 4 views
0

私はwssソケットに接続しようとしています。ホスト名は "myhostname.com/ws/v2"のようになります。ここ は、私が接続を開始する方法である:NSStreamを使用してホスト名に追加のパスがあるwssソケットに接続するには?

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() 

これはエラーで失敗します。 The operation couldn’t be completed. (kCFErrorDomainCFNetwork error 1.)

しかし、それは次のようになりますので、私は、ホスト名からパスを削除する場合:私の中で、その後myhostname.comデリゲート私はイベントopenCompletedを取得します。しかし、それ以降は私のメッセージには反応しません。パスを削除したので、間違ったソケットに接続されているためです。

ホスト名にパスが追加されている場合、ソケットに接続する適切な方法は何ですか?

答えて

0

myhostname.com/ws/v2はホスト名ではありません。それは(不完全な)URLです(完全なURLはwss://myhostname.com/ws/v2です)。ホスト名はmyhostname.comで、そのホスト上のWebsocketパスは/ws/v2です。

WebSocketsハンドシェイクはHTTP/Sを使用しているため、ホストに接続するにはNSStreamで十分ではありません。 TCPソケットをhostとポートに接続し、WSSを使用している場合はSSL/TLSハンドシェイクをネゴシエートしてからpathUpgradeをWebSocketに要求し、成功したHTTP 101応答が返された場合にのみ実行しますWebSocketハンドシェイク。

これは、手動で行う作業の多くです。あなたは本当に代わりに実際のWebSocketクライアントライブラリを使用する必要があります。十分に利用可能です。

関連する問題