Sockets Swift中的TCP套接字

Sockets Swift中的TCP套接字,sockets,tcp,swift,gcdasyncsocket,Sockets,Tcp,Swift,Gcdasyncsocket,我正在尝试使用GCDAsyncSocket在swift中编写一个TCP套接字客户端,但是我遇到了很多问题。在我的代码中,我有一个NSTextField(称为box),下面是我的代码: 进口可可 class AppDelegate: NSObject, NSApplicationDelegate { @IBOutlet weak var window: NSWindow! @IBOutlet weak var box: NSTextField! let bsocket

我正在尝试使用GCDAsyncSocket在swift中编写一个TCP套接字客户端,但是我遇到了很多问题。在我的代码中,我有一个NSTextField(称为box),下面是我的代码: 进口可可

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())

    func applicationDidFinishLaunching(aNotification: NSNotification?)
    {
        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)."
    }
}
当我运行代码时,我希望它在文本框中显示TCP服务器返回的文本,但由于某些原因,函数

func socket(socket : GCDAsyncSocket, didReadData data:NSData, withTag tag:UInt16)
永远不会跑。当我在终端中使用telnet命令以获得相同的结果时,服务器返回以下内容:

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:
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:
然后,当我输入“Arn.Preg:3302:”时,服务器返回以下内容:

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:
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:
当我输入“Arn.Preg:3302:”时,服务器返回“Arn.Resp:3302=329351:”,这是我试图实现的结果,我希望应用程序中的NSTextField显示“Arn.Resp:3302=329351:”

我的问题是,为什么我的代码不这样做,以及如何修复我的代码来这样做

谢谢


编辑:当我运行程序时,NSTEXT字段为空,程序打印“Connecting…”,但它不打印“Connected”或其他任何内容。

套接字初始值设定项中的
self
不是您所想的,它实际上是对AppDelegate类型的引用。尝试将该初始化移动到
ApplicationIDFinishLaunching()


打印出什么?您是否看到“正在连接…”和“已连接”?@NateCook“正在连接…”会打印出来,但“已连接”不会。谢谢!这是我想要的,当我运行它的时候,它现在说“连接到端口8090上的127.0.0.1”和“Arn.TipoSer:XPL0:”在NSTextField中,程序打印“连接…”,“连接到端口8090上的127.0.0.1.”和“收到的响应”,但是,我仍然没有得到“Arn.Resp:3302=329351:“这是一个完全不同的问题:)哦,那我应该单独问一个问题吗?听起来绝对不像白痴,但我可能不是帮助你的人。您遇到的问题是没有获得任何套接字连接信息。现在您正在连接,但没有得到预期的响应。试着找出问题的症结所在,然后用你所知道的一切来总结新问题……好的。非常感谢你的帮助!我真的很感激。