2017-03-02 9 views
0

didReceiveDataが呼び出されなかった作品何も見つからなかったのです - 私はそれがOK受信サーバーにメッセージを送信するために私のメインラインの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

サンプルコードをお手伝いいただきありがとうございます。あなたがバインドする必要があるのはサーバーの場合だけです。クライアントはバインドする必要はありません。あれは正しいですか?それはあなたのdidReceive(私はdidReceiveData代わりに)コールバック関数を使用して今私のために働いた。助けてくれてありがとう。 – stran

関連する問題