【发布时间】:2015-08-11 21:40:29
【问题描述】:
大家好,标题提到我正在尝试以 Swift 语言从我的 Redis 服务器发送和接收数据。我已经做了很多研究,但我无法找到关于这个主题的好答案,我最接近的是 NSStream 或一些 Github 项目(其中大部分代码损坏),我一直在尝试创建一个解决了3天了,求大神帮忙。
Redis 在端口 6379 上的连接要求:
- TCP
- Telnet(我的最爱)
问题:
- App Delegate 崩溃线程 1:
EXC_BAD_ACCESS(code=1, address=XXXXXXXX)有时 - 无数据返回
带初始化的类 (Redis): 最接近我可以使用 NSStream 理解该过程的水平,但这并没有在我的对话框中打印任何要返回的内容,我无法弄清楚出了什么问题。 p>
class Redis: NSObject, NSStreamDelegate {
//Intilizing Stream & Requirement
var endPoint: CFString?
var onPort: UInt32?
var inputStream: NSInputStream?
var outputStream: NSOutputStream?
服务器连接功能:
func serverConnection(endPoint: CFString, onPort: UInt32){
//Streams Init
let Host: CFString = endPoint
let Port: UInt32 = onPort
var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?
//Bind Streams to Host and Port
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, Host, Port, &readStream, &writeStream)
//Cast CFStream to NSStreams
inputStream = readStream!.takeRetainedValue()
outputStream = writeStream!.takeRetainedValue()
//Assign Delegate
inputStream!.delegate = self
outputStream!.delegate = self
//Schadule Run-loop
inputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
outputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
//Open Connection
inputStream!.open()
outputStream!.open()
}
流:应用午餐后,我收到一个应用委托错误SOMETIMES
线程 1:EXC_BAD_ACCESS(code=1, address=XXXXXXXX)
func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
if aStream === inputStream {
switch eventCode {
case NSStreamEvent.ErrorOccurred:
//Print Available Errors
print("Error: \(aStream.streamError?.description)")
break
case NSStreamEvent.OpenCompleted:
//Connection Succeed
print("Connection Complete \(aStream.description)")
break
case NSStreamEvent.HasBytesAvailable:
//Server Respond
var buffer = [UInt8](count: 8, repeatedValue: 0)
while inputStream?.hasBytesAvailable != nil {
let result: Int = (inputStream?.read(&buffer, maxLength: buffer.count))!
print(result)
print(buffer)
}
break
default:
break
}
}
if aStream === outputStream {
switch eventCode {
case NSStreamEvent.ErrorOccurred:
//Print Available Errors
print("Error: \(aStream.streamError?.description)")
break
case NSStreamEvent.OpenCompleted:
//Connection Succeed
print("Connection Complete \(aStream.description)")
break
case NSStreamEvent.HasSpaceAvailable:
//Ready to Send more Dat
print("HasSpaceAvailable \(aStream.description)")
break
default:
break
}
}
}
使用 Ping 进行服务器测试:返回应该是 PONG
func Ping(){
let Command: NSString = NSString(format: "Ping /n", String(endPoint))
let data: NSData = NSData(data: Command.dataUsingEncoding(NSUTF8StringEncoding)!)
outputStream!.write(UnsafePointer<UInt8>(data.bytes), maxLength: data.length)
}
【问题讨论】:
标签: ios swift sockets redis nsstream