2017-03-02 7 views
0

didReceiveData가 호출되지 않았다 작동 아무도 발견하고 - 나는 그것이 확인을받은 서버에 메시지를 보내 내 주류 의 UIViewController에 의해 호출 된이 신속 클래스를 코딩을 , 서버가 응답을 보냈을 때 didReceiveData()가 트리거되지 않았으므로 클라이언트는 결코 응답을 수신하지 않습니다.나는 GCDAsyncUdpSocket에 대한 몇 가지 예를 찾고 있지만,

나는 인터넷 검색을 계속하고 문서를보고 클라이언트가 바인딩 할 필요가 없다고 말했습니다 (서버에서만이 작업이 필요합니다). 아무에게도 도움이 될 수 있습니까? 미리 감사드립니다.

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()를 제거 했는데도 데이터를받지 못했습니다 - 콜백 함수에 오류가 있습니다 - didReceive 대신 didReceiveData로 코딩되어 작동합니다 - 도와 주셔서 감사합니다. – 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

샘플 코드를 도와 주셔서 감사합니다. 의사가 서버를위한 것이라면 바인드 만하면된다고 의사가 어떻게 말했습니까? 클라이언트는 바인딩 할 필요가 없습니다. 그 맞습니까? btw 그것은 didReceive (나는 didReceiveData 대신에) 콜백 함수를 사용하여 현재 나를 위해 일했다. 도와 줘서 고마워. – stran