Swift 3 Socket问题
问题描述:
我在Swift 3中编写了一个非常简单的基于套接字的命令行工具,但是我的流并没有调用委托方法。例如,当我检查字节是否可用时,有可用的字节,但委托方法尚未被调用。这里是我的连接代码:Swift 3 Socket问题
func connect() {
print("Socket Connection")
let ipAddress = "127.0.0.1" as CFString
let portNumber: UInt32 = 8080
var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(nil, ipAddress, portNumber, &readStream, &writeStream)
self.inputStream = readStream!.takeRetainedValue()
self.outputStream = writeStream!.takeRetainedValue()
self.inputStream?.delegate = self
self.outputStream?.delegate = self
self.inputStream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
self.outputStream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
self.inputStream?.open()
self.outputStream?.open()
}
答
这可能有助于
var inputStream:InputStream!
var outputStream:OutputStream!
var buffer = [UInt8](repeating: 0, count: 1024)
func useCFStream() {
let host:CFString = "news.yahoo.com" as CFString
let port:uint = 80
var readStream :Unmanaged<CFReadStream>?;
var writeStream:Unmanaged<CFWriteStream>?;
CFStreamCreatePairWithSocketToHost(nil, host as CFString, port, &readStream, &writeStream)
inputStream = readStream!.takeRetainedValue()
outputStream = writeStream!.takeRetainedValue()
inputStream.delegate = self
outputStream.delegate = self
inputStream.schedule(in: RunLoop.current, forMode:.defaultRunLoopMode)
outputStream.schedule(in:RunLoop.current, forMode:.defaultRunLoopMode)
inputStream.open()
outputStream.open()
let iData = "GET /rss/entertainment HTTP/1.1 \n\n"
var sendData = iData.data(using: String.Encoding.utf8)
let uData = sendData?.withUnsafeBytes({ (buffer:UnsafePointer<UInt8>?) -> UnsafePointer<UInt8> in
return buffer!.advanced(by: 0)
})
outputStream.write(uData!, maxLength: sendData!.count)
}
func stream(_ stream: Stream, handle eventCode: Stream.Event) {
if stream === inputStream {
print("input")
switch eventCode {
case Stream.Event.openCompleted:
//print("input: openCompleted")
break
case Stream.Event.hasBytesAvailable:
print("input: HasBytesAvailable")
inputStream.read(&buffer, maxLength: buffer.count)
while inputStream.hasBytesAvailable {
_ = inputStream.read(&buffer, maxLength: buffer.count)
let str = String(bytes: buffer, encoding: String.Encoding.utf8)
print(" \(str)")
}
default:
print("default")
}
}
else if stream === outputStream {
//print("output")
}
}
不能保证代码优化。 我还没有明白withUnsafeBytes和UnsafePointer的用法,但设法使它的工作,如果有人有更好的解决方案,请发布。
+0
这确实有帮助。谢谢! – elmarko
你可以尝试用mainRunLoop而不是当前的。 – Hasya
我尝试过,但它有相同的结果。 – wt65074
我建议你去https://github.com/tidwall/SwiftWebSocket,使用这个包装类,我用它在我的项目。它非常耐用和坚固耐用。 – Hasya