问题描述
我终于可以使用此套接字设置了:
func setupConnection(){
var error : NSError?
socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue())
socket.bindToPort(PORT, error: &error)
socket.connectToHost(SERVER_IP, onPort: PORT, error: &error)
socket.beginReceiving(&error)
send("ping")
}
func send(message:String){
let data = message.dataUsingEncoding(NSUTF8StringEncoding)
socket.sendData(data, withTimeout: 2, tag: 0)
}
解决方法
背景:
我希望能够在我的iOS应用程序和服务器之间发送和接收UDP数据包。服务器将所有传入消息回显给应用程序客户端。 服务器已测试并确认可以正常工作
。我有一个StartViewController,它启动了两个实现GCDAsyncUdpSocketDelegate的类,一个用于发送,一个用于接收。“发送套接字”正在工作,服务器接收到消息。
问题:
在发送后,该应用程序再也不会取回传入的消息。监听套接字设置有些问题,因为didReceiveData永远不会被调用。
我做错了吗?
开始:
class StartViewController: UIViewController {
var inSocket : InSocket!
var outSocket : OutSocket!
override func viewDidLoad() {
super.viewDidLoad()
inSocket = InSocket()
outSocket = OutSocket()
}
@IBAction func goButton(sender: UIButton) {
outSocket.send("This is a message!")
}
}
接收:
class InSocket: NSObject,GCDAsyncUdpSocketDelegate {
let IP = "255.255.255.255"
let PORT:UInt16 = 5556
var socket:GCDAsyncUdpSocket!
override init(){
super.init()
setupConnection()
}
func setupConnection(){
var error : NSError?
socket = GCDAsyncUdpSocket(delegate: self,delegateQueue: dispatch_get_main_queue())
socket.bindToPort(PORT,error: &error)
socket.enableBroadcast(true,error: &error)
socket.joinMulticastGroup(IP,error: &error)
socket.beginReceiving(&error)
}
func udpSocket(sock: GCDAsyncUdpSocket!,didReceiveData data: NSData!,fromAddress address: NSData!,withFilterContext filterContext: AnyObject!) {
println("incoming message: \(data)");
}
}
发送:
class OutSocket: NSObject,GCDAsyncUdpSocketDelegate {
let IP = "90.112.76.180"
let PORT:UInt16 = 5556
var socket:GCDAsyncUdpSocket!
override init(){
super.init()
setupConnection()
}
func setupConnection(){
var error : NSError?
socket = GCDAsyncUdpSocket(delegate: self,delegateQueue: dispatch_get_main_queue())
socket.connectToHost(IP,onPort: PORT,error: &error)
}
func send(message:String){
let data = message.dataUsingEncoding(NSUTF8StringEncoding)
socket.sendData(data,withTimeout: 2,tag: 0)
}
func udpSocket(sock: GCDAsyncUdpSocket!,didConnectToAddress address: NSData!) {
println("didConnectToAddress");
}
func udpSocket(sock: GCDAsyncUdpSocket!,didNotConnect error: NSError!) {
println("didNotConnect \(error)")
}
func udpSocket(sock: GCDAsyncUdpSocket!,didSendDataWithTag tag: Int) {
println("didSendDataWithTag")
}
func udpSocket(sock: GCDAsyncUdpSocket!,didNotSendDataWithTag tag: Int,dueToError error: NSError!) {
println("didNotSendDataWithTag")
}
}
编辑: 添加了被遗忘的代码行。