Как подключиться к сокету из приложения Какао с помощью IBM BlueSocket - PullRequest
0 голосов
/ 21 ноября 2019

В приложении панели меню Какао я пытаюсь подключиться к сокету Unix Domain с помощью библиотеки BlueSocket. Но когда я вызываю метод .connectToDaemon внутри класса AppDelegate, он не устанавливает соединение, также нет необходимости иметь несколько потоков, это будет просто один подключенный клиент, поэтому он просто должен сделать запись соединениянекоторые данные в сокете и блокировка при вызове чтения до тех пор, пока сервер не записывает что-либо и т. д.

Ниже приведен класс, но, как уже упоминалось ранее, когда я вызываю функцию .connectToDaemon(), она на самом деле не подключается,Что я делаю не так?

import Foundation
import Socket

class DaemonCommander {
    var daemonSocket: Socket? = nil
    var socketPath: String
    static var bufferSize = 1024

    init(sockPath: String) {
        self.socketPath = sockPath
    }

    deinit {
        self.daemonSocket?.close()
    }
    // connect sets up the socket and connects to the daemon sokcet
    public func connectToDaemon() {
        do {
            print("Connect to daemon called")
            // Create an unix socket...
            try self.daemonSocket = Socket.create(family: .unix, type: .stream, proto: .unix)

            guard let socket = self.daemonSocket else {
                print("Unable to unwrap socket...")
                return
            }
            self.daemonSocket = socket
            try daemonSocket?.connect(to: self.socketPath)
        } catch let error {
            guard error is Socket.Error else {
                print("Unexpected error...")
                return
            }
        }
    }

    public func sendCommand(command: String) -> String {
        let readData = Data(capacity: DaemonCommander.bufferSize)
        do {
            try self.daemonSocket?.write(from: command)
            print(readData)
        } catch let error {
            guard error is Socket.Error else {
                return "Unexpected error whilw connection"
            }
        }
        return String(decoding: readData, as: UTF8.self)
    }
}

В файле AppDelegate.swift:

import Cocoa

let socketPath: String = "/tmp/daemon.sock"

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    let statusItem = NSStatusBar.system.statusItem(withLength:NSStatusItem.squareLength)

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        if let button = statusItem.button {
            button.image = NSImage(named:NSImage.Name("Eye"))
        }
        statusItem.menu = self.menu
        populateMenuState()
    }

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

    @IBAction func buttonOnMenuClicked(_ sender: Any) {
        setupConnection()
    }

    func setupConnection() {
        print("connection setup")
        let daemonConnection = DaemonCommander(sockPath: socketPath)
        daemonConnection.connectToDaemon()
        let reply = daemonConnection.sendCommand(command: "show")
        print(reply)
    }
}
...