如何通过iOS中的套接字从服务器接收数据?
问题描述:
我有一个应用程序,我必须使用套接字连接将数据发送到服务器,并读取将由服务器发送的数据。我正在使用AsyncSocket
类来写入和读取数据。我成功地在服务器上写入数据,服务器可以看到应用程序发送的数据。现在,问题是,每当服务器发送一些数据到应用程序,那么我如何使用AsyncSocket
类来接收这些数据。以下是我的代码。我把代表方法读取数据,但它从来没有调用。如何通过iOS中的套接字从服务器接收数据?
var socket = AsyncSocket()
socket = AsyncSocket(delegate: self)
self.socketConnect()
func socketConnect() {
do {
try socket?.connectToHost("IP Address", onPort: 6968)
} catch _ as NSError {
}
}
//MARK: - AsyncSocket Delegates method
func onSocket(sock: AsyncSocket!, didConnectToHost host: String!, port: UInt16) {
print("Connected to host : \(host) with Port : \(port)")
let alert:UIAlertController = UIAlertController(title: "Connected", message: "Host:\(host) ** Port:\(port)", preferredStyle:.Alert)
self.presentViewController(alert, animated: true, completion: nil)
let action:UIAlertAction = UIAlertAction(title: "Ok", style: .Default) { (UIAlertAction) -> Void in
print("Ok Pressed")
}
alert .addAction(action)
let dict = ["iUserId":"100","iRideId":"276","type":"client"] // For client side
var jsonString = NSString()
do {
let data = try NSJSONSerialization.dataWithJSONObject(dict , options: NSJSONWritingOptions.PrettyPrinted)
jsonString = NSString(data: data, encoding: NSUTF8StringEncoding)!
}catch let error as NSError {
print(error)
}
let reqData = jsonString.dataUsingEncoding(NSUTF8StringEncoding)
socket.writeData(reqData, withTimeout: 1.0, tag: 100)
}
func onSocket(sock: AsyncSocket!, didReadPartialDataOfLength partialLength: UInt, tag: Int) {
print("Read partial data")
}
func onSocket(sock: AsyncSocket!, didWriteDataWithTag tag: Int) {
print("Data write successfully")
}
func onSocket(sock: AsyncSocket!, didReadData data: NSData!, withTag tag: Int) {
print("Data read successfully")
}
func onSocket(sock: AsyncSocket!, willDisconnectWithError err: NSError!) {
print("Socket disconnect with error :\(err.description)")
}
func onSocket(sock: AsyncSocket!, didAcceptNewSocket newSocket: AsyncSocket!) {
print("Accept new socket")
}
答
我找到了自己的答案。我错过的是,我必须把套接字连接到主机时,readdata行。所以写完这个didReadData方法后,将被调用,并在该方法也必须编写一个单行代码,我写在didConnectToHost方法。
func socket(sock: GCDAsyncSocket!, didConnectToHost host: String!, port: UInt16) {
print("Connected to host : \(host) with Port : \(port)")
socket.readDataWithTimeout(-1, tag: 0)
}
func socket(sock: GCDAsyncSocket!, didReadData data: NSData!, withTag tag: Int) {
print("Data read successfully")
socket.readDataWithTimeout(-1, tag: 0)
}
这个类(委托一)从NSObject继承吗? http://stackoverflow.com/a/24225381/653513 –