2017-10-12 12 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입니다.

웹 소켓 핸드 셰이크는 HTTP/S를 사용하므로 NSStream으로 호스트에 연결하는 것만으로는 충분하지 않습니다. TCP 소켓을 host 및 포트에 연결 한 다음 WSS를 사용하는 경우 SSL/TLS 핸드 셰이크를 협상 한 다음 HTTP를 사용하여 path을 요청하여 Upgrade을 WebSocket에 요청하고 성공적인 HTTP 101 응답이 반환 된 경우에만 수행하십시오 WebSocket 핸드 셰이크.

수동으로해야 할 일이 많습니다. 실제로 실제 WebSocket 클라이언트 라이브러리를 대신 사용해야합니다. 많은 것들이 있습니다.