【问题标题】:How to connect to Socket.IO如何连接到 Socket.IO
【发布时间】:2019-05-05 01:29:25
【问题描述】:

我已经连接到 Socket.IO,但仍然出现错误。

我创建了一个 Socket.IO 管理器:

class SocketIOManager: NSObject {

    static let sharedInstance = SocketIOManager()

    func establishConnection() {
        socket.connect()
    }

    func closeConnection() {
        socket.disconnect()
    }

    func join(nickname: String) {
        socket.emit("join", nickname)
    }


    func exitChatWithNickname(nickname: String, completionHandler: () -> Void) {
        socket.emit("userdisconnect", nickname)
        completionHandler()
    }


    func sendMessage(message: String, withNickname nickname: String) {
        socket.emit("messagedetection", nickname, message)
    }


    func getChatMessage(completionHandler: @escaping (_ messageInfo: Message) -> Void) {
        socket.on("message") { (dataArray, socketAck) -> Void in
            var message = Message()

            let eventDataTemp = dataArray[0] as? [String: Any]
            //let eventData = eventDataTemp![0] as? Dictionary<String, String>;
            print(eventDataTemp)
            message.idUser = eventDataTemp?["senderNickname"] as! String
            message.message = eventDataTemp?["message"] as! String
            completionHandler(message)
        }
    }


    private func listenForOtherMessages() {
        socket.on("userjoinedthechat") { (dataArray, socketAck) -> Void in
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: "userWasConnectedNotification"), object: dataArray[0] as! [String: AnyObject])
        }
    }
}

这是我的错误

LOG SocketIOClient{/}: Handling event: error with data: ["Tried emitting when not connected"]

【问题讨论】:

    标签: ios swift socket.io


    【解决方案1】:

    您的错误清楚地表明您的应用正在尝试emit while its not connected to socket。在进行任何发射之前,您需要确保已建立与套接字的连接。 通常,您希望在应用程序开始运行时连接到套接字,并在应用程序关闭或进入后台时关闭连接。

    这就是我在我的应用程序中实现 SocketIO 的方式。

    第 1 步:创建一个名为 SocketManager.swift 的 Socket Manager 文件并添加此代码。

    import SocketIO
    
    class SocketIOManager: NSObject {
        static let sharedInstance = SocketIOManager()
    
        let manager = SocketManager(socketURL: URL(string: "YOUR_SOCKET_URL")!, config: [.log(true), .connectParams([])
    
        var socket: SocketIOClient!
    
        override init() {
        super.init()
    
            socket = manager.defaultSocket
    
            //Listener to capture any message that your server emits for "emitMessage" key. You can add multiple listeners to capture various emits from your server.
            socket.on("emitMessage") { (data, ack) in
                print("Socket Ack: \(ack)")
                print("Emitted Data: \(data)")
                //Do something with the data you got back from your server.
            }
        }
    
        //Function for your app to emit some information to your server.
        func emit(message: [String: Any]){
            print("Sending Message: \([message])")
            socket.emit("sendMessage", with: [message])
        }
    
        //Function to establish the socket connection with your server. Generally you want to call this method from your `Appdelegate` in the `applicationDidBecomeActive` method.
        func establishConnection() {
            socket.connect()
            print("Connected to Socket !")
        }
    
        //Function to close established socket connection. Call this method from `applicationDidEnterBackground` in your `Appdelegate` method.
        func closeConnection() {
            socket.disconnect()
            print("Disconnected from Socket !")
        }
    }
    

    第 2 步:在您的 AppDelegate.swift 文件中添加以下内容。

    func applicationDidEnterBackground(_ application: UIApplication) {
        SocketIOManager.sharedInstance.closeConnection()
    }
    
    func applicationDidBecomeActive(_ application: UIApplication) {
        SocketIOManager.sharedInstance.establishConnection()
    }
    

    第 3 步:当您想要向服务器发出发射时,您可以在应用中的任何位置执行此操作。

    SocketIOManager.sharedInstance.emit(message: "message": "This is a test message")
    

    【讨论】:

      【解决方案2】:

      试试这个 全局添加

      let manager = SocketManager(socketURL: URL(string: "http://localhost:8080")!, config: [.log(true), .compress])
      let socket = manager.defaultSocket
      

      调用这个方法

      import SocketIO
      
      
      func callSocket()
      {
         socket.on(clientEvent: .connect) {data, ack in
             print("socket connected")
         }
      
         socket.on("currentAmount") {data, ack in
             guard let cur = data[0] as? Double else { return }
      
             socket.emitWithAck("canUpdate", cur).timingOut(after: 0) {data in
                 socket.emit("update", ["amount": cur + 2.50])
             }
      
             ack.with("Got your currentAmount", "dude")
         }
      
         socket.connect()
      }
      

      访问:https://github.com/socketio/socket.io-client-swift

      【讨论】:

      • 我试过了,但它在我的节点服务器上不起作用,我将 socketIO connect io.on('connection', (socket) => { console.log('user connected'); socket. on('join', function(userNickname) { console.log(userNickname +" : 已加入聊天 " ); socket.broadcast.emit('userjoinedthechat',userNickname +" : 已加入聊天 "); })
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 2019-12-27
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多