2017-03-02 25 views
0

didReceiveData從來沒有叫 - 我編寫這裏面叫我的主線的UIViewController迅速類發出一個信息,它收到了OK的服務器,但是當服務器發回響應時,客戶端永遠不會收到它,因爲didReceiveData()從未觸發。我找上GCDAsyncUdpSocket一些例子,但沒有發現任何的作品

我一直在使用Google,並期待在文檔,和它說,客戶並不需要綁定(只有服務器需要這樣做),任何人都可以幫我這個 - 在此先感謝。

import UIKit 

import CocoaAsyncSocket 


class UdpSocketSR: NSObject, GCDAsyncUdpSocketDelegate { 


var socket:GCDAsyncUdpSocket! 

var rc : Int = 0 
var messageOut : String = "" 
var messageIn : String = "" 


override init(){ 
    super.init() 
} 


func SetupAndSend(IP: String, PORT: Int, DATA : String) -> Int 
{ 
    socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: DispatchQueue.main) 


    messageOut = DATA 
    do { 
     let data = messageOut.data(using: String.Encoding.utf8) 

     socket.send(data!, toHost: IP, port: UInt16(PORT), withTimeout: 3, tag: 0) 

     try socket.beginReceiving() 
     sleep(3) 
     socket.close() 

    } catch { 
     rc = -1 
    } 

    return rc 
} 



private func udpSocket(sock:GCDAsyncUdpSocket!,didConnectToAddress data : NSData!){ 
    rc = -2 
} 

private func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData dataRecv: NSData!, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) { 

    messageIn = NSString(data: dataRecv as Data, encoding: String.Encoding.utf8.rawValue) as! String 

} 


} 
+0

爲什麼你關閉套接字正確發送後..? – WeiJay

+0

我刪除了socket.close(),它仍然沒有收到數據 - 錯誤是與回調函數 - 我把它編碼爲didReceiveData而不是didReceive,它的工作原理 - 感謝您的幫助。 – stran

回答

0

爲什麼在發送後關閉套接字?它對我來說是有效的。

class UdpSocketSR: GCDAsyncSocket, GCDAsyncUdpSocketDelegate { 
    var socket: GCDAsyncUdpSocket! 

    func SetupAndSend() { 
     let host = "127.0.0.1" // IP 
     let port: UInt16 = 1234 // Port 
     let message = messageOut.data(using: String.Encoding.utf8)! 

     socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: DispatchQueue.main) 

     do { 
      try socket.bindToPort(port) 
      try socket.enableBroadcast(true) 
      try socket.beginReceiving() 
      socket.send(message, toHost: host, port: port, withTimeout: 2, tag: 0) 
     } 
    } 

    // Delegate 
    func udpSocket(_ sock: GCDAsyncUdpSocket, didNotConnect error: Error){ 
     print("UDP Connection error: \(error)") 
    } 

    func udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, fromAddress address: Data, withFilterContext filterContext: Any?) { 
     var host: NSString? 
     var port: UInt16 = 0 
     GCDAsyncUdpSocket.getHost(&host, port: &port, fromAddress: address) 
     print(host) 
    } 
} 
+0

感謝您對示例代碼的幫助。 doc如何說你只需要綁定,如果它是服務器的 - 客戶端不需要綁定。那是對的嗎?順便說一句,它的工作對我來說,現在使用didReceive(我不得不didReceiveData代替)回調函數。非常感謝您的幫助。 – stran

相關問題