Ios 如何使用NSStream连接到主机名具有附加路径的wss套接字?
我正在尝试连接到wss套接字,主机名如下:“myhostname.com/ws/v2”。 以下是我如何启动连接: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
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进行升级
,并且仅当返回成功的HTTP101
应答时,才执行WebSocket握手
这需要手动完成大量工作。实际上,您应该使用实际的WebSocket客户端库。有很多