Ios 如何使用NSStream连接到主机名具有附加路径的wss套接字?

Ios 如何使用NSStream连接到主机名具有附加路径的wss套接字?,ios,sockets,wss,nsstream,nsinputstream,Ios,Sockets,Wss,Nsstream,Nsinputstream,我正在尝试连接到wss套接字,主机名如下:“myhostname.com/ws/v2”。 以下是我如何启动连接: let host = "myhostname.com/ws/v2" CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host as CFString, 443, &readStream, &writeStream) inputStream = readStream!.takeRetainedValue

我正在尝试连接到wss套接字,主机名如下:“myhostname.com/ws/v2”。 以下是我如何启动连接:

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()
此操作失败并出现错误:
无法完成该操作。(KCFERRORDOMAINCF网络错误1.

但是,如果我从主机名中删除路径,它看起来是这样的:
myhostname.com
,那么在我的委托中我会得到一个事件
openCompleted
。但是,在那之后它不会响应我的消息,我认为这是因为我连接到了一个错误的套接字,因为我删除了路径


当主机名具有附加路径时,连接到套接字的正确方式是什么?

myhostname.com/ws/v2
不是主机名。它是一个(不完整的)URL(完整的URL是
wss://myhostname.com/ws/v2
)。主机名就是
myhostname.com
,而该主机上的Websocket路径就是
/ws/v2

WebSockets握手使用HTTP/S,因此仅使用
NSStream
连接到主机是不够的。您必须将TCP套接字连接到
主机和端口,然后协商SSL/TLS握手(如果使用WSS),然后使用HTTP请求
路径
,请求对WebSocket进行
升级
,并且仅当返回成功的HTTP
101
应答时,才执行WebSocket握手

这需要手动完成大量工作。实际上,您应该使用实际的WebSocket客户端库。有很多