В приложении панели меню Какао я пытаюсь подключиться к сокету 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)
}
}