2014-09-08 2 views
0

GCDAsyncSocket을 사용하여 신속하게 TCP 소켓 클라이언트를 작성하려고하는데 문제가 하나 있습니다. 내 코드에서 나는 여기에 NSTextField있는 (전화 상자)를 가지고하는 것이 내 코드입니다 : 내 TCP 서버에 액세스하려고 터미널에서 telnet 명령을 사용하면스위프트 클라이언트의 TCP 서버로부터 응답 받기

import Cocoa 

class AppDelegate: NSObject, NSApplicationDelegate 
{ 

    @IBOutlet weak var window: NSWindow! 
    @IBOutlet weak var box: NSTextField! 

    var bsocket: GCDAsyncSocket! 

    func applicationDidFinishLaunching(aNotification: NSNotification?) 
    { 
     bsocket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue()) 
     var port:UInt16 = 8090 
     if (!bsocket.connectToHost("localhost", onPort: port, error: nil)) 
     { 
      println("Error") 
     } 
     else 
     { 
      println("Connecting...") 
     } 
     var request:String = "Arn.Preg:3302:" 
     var data:NSData = request.dataUsingEncoding(NSUTF8StringEncoding)! 
     bsocket.writeData(data, withTimeout: -1.0, tag: 0) 
     bsocket.readDataWithTimeout(-1.0, tag: 0) 
    } 

    func applicationWillTerminate(aNotification: NSNotification?) 
    { 
     // Insert code here to tear down your application 
    } 

    func socket(socket : GCDAsyncSocket, didReadData data:NSData, withTag tag:UInt16) 
    { 
     var response = NSString(data: data, encoding: NSUTF8StringEncoding) 
     println("Received Response") 
     box.stringValue = box.stringValue + "\n" + response 
    } 

    func socket(socket : GCDAsyncSocket, didConnectToHost host:String, port p:UInt16) 
    { 
     println("Connected to \(host) on port \(p).") 
     box.stringValue = box.stringValue + "\n" + "Connected to \(host) on port \(p)." 
    } 
} 

func socket(socket : GCDAsyncSocket, didReadData data:NSData, withTag tag:UInt16) 

,이 결과입니다. 내가 입력 그런

Marzuk:~ marzukrashid$ telnet localhost 8090 
Trying ::1... 
telnet: connect to address ::1: Connection refused 
Trying 127.0.0.1... 
Connected to localhost. 
Escape character is '^]'. 
Arn.TipoSer:XPL0: 

, "3302 : Arn.Preg"는 "서버가 반환 :

Marzuk:~ marzukrashid$ telnet localhost 8090 
Trying ::1... 
telnet: connect to address ::1: Connection refused 
Trying 127.0.0.1... 
Connected to localhost. 
Escape character is '^]'. 
Arn.TipoSer:XPL0: 
Arn.Preg:3302: 
Arn.Resp:3302=329351: 

나는": 3302 Arn.Preg "를 입력하면, 서버는이 반환 Arn.Resp : 3302 = 329351 : "이것은 달성하고자하는 결과입니다. 응용 프로그램의 NSTextField에"Arn.Resp : 3302 = 329351 : "을 표시하고 싶습니다. 지금, 코드를 실행할 때, 프로그램은 "Connecting ...", "Connected to 127.0.0.1 on port 8090"및 "Received Response"를 응용 프로그램 자체의 NSTextField에 기록합니다. "포트 8090에 127.0.0.1에 연결됨"이 표시됩니다. 및 "Arn.TipoSer : XPl0 :"로 표시해야하지만 "Arn.Resp : 3302 = 329351 :"이 표시되지 않습니다.

내 질문에 내 코드가이 일을하지 않는 이유는 무엇이며 어떻게 코드를 수정해야합니까?

감사합니다.

+0

죄송합니다. 코드를 변경하는 것을 잊어 버렸습니다. 방금 편집했습니다. – Marzukr

답변

1

를, 그래서 didConnectToHost, didReadData 및 applicationDidFinishLaunching에 readDataWithTimeout 함수를 추가했습니다. 터미널에서 사용 된 반환 키 입력을 요청 끝에 "\ n"이 필요하다는 것을 알았 기 때문에 "Arn.Preg : 3302 :"에 "\ n"을 추가하여 "Arn.Preg"로 만들었습니다 : 3302 : \ n " 최종 코드는 다음과 같습니다.

import Cocoa 

class AppDelegate: NSObject, NSApplicationDelegate { 

    @IBOutlet weak var window: NSWindow! 
    @IBOutlet weak var box: NSTextField! 


    //let bsocket = GCDAsyncSocket(delegate: AppDelegate.self, delegateQueue: dispatch_get_main_queue()) 
    var bsocket: GCDAsyncSocket! 

    func applicationDidFinishLaunching(aNotification: NSNotification?) 
    { 
     bsocket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue()) 
     var port:UInt16 = 8090 
     if (!bsocket.connectToHost("localhost", onPort: port, error: nil)) 
     { 
      println("Error.") 
     } 
     else 
     { 
      println("Connecting...") 
     } 
     bsocket.readDataWithTimeout(-1.0, tag: 0) 
    } 

    func applicationWillTerminate(aNotification: NSNotification?) { 
     // Insert code here to tear down your application 
    } 

    func socket(socket : GCDAsyncSocket, didReadData data:NSData, withTag tag:UInt16) 
    { 
     var response = NSString(data: data, encoding: NSUTF8StringEncoding) 
     println("Received Response") 
     box.stringValue = box.stringValue + "\n" + response 
     bsocket.readDataWithTimeout(-1.0, tag: 0) 
    } 

    func socket(socket : GCDAsyncSocket, didConnectToHost host:String, port p:UInt16) 
    { 
     println("Connected to \(host) on port \(p).") 
     box.stringValue = box.stringValue + "\n" + "Connected to \(host) on port \(p)." 
     bsocket.readDataWithTimeout(-1.0, tag: 0) 
     sendRequest() 
    } 

    func sendRequest() 
    { 
     var request:String = "Arn.Preg:3302:\n" 
     var data:NSData = request.dataUsingEncoding(NSUTF8StringEncoding)! 
     bsocket.writeData(data, withTimeout: -1.0, tag: 0) 
    } 

} 
0

내게는 Arn.Preg:3302: 메시지를 보내고 실제로 연결하기 전에 응답을받는 것처럼 보입니다. 당신에 applicationDidFinishLaunching 당신은 비동기 연결을 시작하고 즉시 writeDatareadData 전화 - 당신은 아마 같은 것을 할 필요가 : 나는 readDataWithTimeout 기능이 실행될 때 didReadData 기능 만 실행하도록 배운

class AppDelegate: NSObject, NSApplicationDelegate 
{ 

    @IBOutlet weak var window: NSWindow! 
    @IBOutlet weak var box: NSTextField! 

    var bsocket: GCDAsyncSocket! 

    func applicationDidFinishLaunching(aNotification: NSNotification?) 
    { 
     bsocket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue()) 
     var port:UInt16 = 8090 
     if (!bsocket.connectToHost("localhost", onPort: port, error: nil)) 
     { 
      println("Error") 
     } 
     else 
     { 
      println("Connecting...") 
     } 
    } 

    func socket(socket : GCDAsyncSocket, didReadData data:NSData, withTag tag:UInt16) 
    { 
     var response = NSString(data: data, encoding: NSUTF8StringEncoding) 
     println("Received Response") 
     box.stringValue = box.stringValue + "\n" + response 
    } 

    func socket(socket : GCDAsyncSocket, didConnectToHost host:String, port p:UInt16) 
    { 
     println("Connected to \(host) on port \(p).") 
     box.stringValue = box.stringValue + "\n" + "Connected to \(host) on port \(p)." 

     var request:String = "Arn.Preg:3302:" 
     var data:NSData = request.dataUsingEncoding(NSUTF8StringEncoding)! 
     bsocket.writeData(data, withTimeout: -1.0, tag: 0) 
     bsocket.readDataWithTimeout(-1.0, tag: 0) 
    } 
} 
+0

도움을 주셔서 감사합니다. 그러나 이것을 시도한 후에도 결과는 같습니다. didReadData 함수로 요청을 옮겨 보았지만 그 중 하나도 작동하지 않았습니다. – Marzukr