배경 :스위프트 : GCDAsyncUdpSocket으로 UDP 수신
내 iOS 앱과 서버간에 UDP 패킷을주고받을 수 있기를 원합니다. 서버는 들어오는 모든 메시지를 클라이언트에 다시 표시합니다. 서버가 테스트되고 작동중인 것으로 확인되었습니다.. 나는 GCDAsyncUdpSocketDelegate를 구현하는 두 개의 클래스를 시작하는 StartViewController를 가지고있다. 하나는 전송 용이고 다른 하나는 수신 용이다. "송신 소켓"이 작동하면 서버가 메시지를 수신합니다.
문제 :
응용이 전송되었습니다 다시 후에 들어오는 메시지가 없습니다. 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")
}
}
편집 : 추가 잊어 코드 라인을.
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)
}
정확히 InSocket에 소켓 속성을 초기화 할 경우 : – Anton
Anton. 눈치 채기위한 Thx. 그것은 프로젝트 코드에서 복사/붙여 넣기 실수 였고 방금 추가했습니다. 소켓 initialazion 내 프로젝트 코드에 있기 때문에 그러나 이것은 문제가되지 않습니다. – rilar