首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >swift套接字io连接到服务器,但管理器和引擎正在发布。

swift套接字io连接到服务器,但管理器和引擎正在发布。
EN

Stack Overflow用户
提问于 2018-02-08 00:34:47
回答 1查看 3K关注 0票数 1

我正在尝试制作一个超级基本的快速应用程序,它连接到我的节点后端socket.io服务器,但是当我运行下面的代码时,会得到一个长错误,如下所示。在后端,它说,应用程序连接到服务器,但当我试图发出任何事件,我会得到另一个错误,也是下面。

快速代码:

代码语言:javascript
运行
复制
import UIKit
import SocketIO

class ViewController: UIViewController {

@IBOutlet weak var messagesBody: UITextView!
@IBOutlet weak var newMessageInput: UITextField!
@IBOutlet weak var newMessageSubmit: UIButton!

var socket:SocketIOClient!

override func viewDidLoad() {
    super.viewDidLoad()

    let manager = SocketManager(socketURL: URL(string: "http://localhost:3000/chat.html?name=developer&room=test")!, config: [.log(true), .compress])
    self.socket = manager.socket(forNamespace: "/")

    establishSocketConnection()

    newMessageSubmit.addTarget(self, action: #selector(sendNewMessage), for: .touchUpInside)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

func establishSocketConnection() {
    self.socket.connect()
    self.socket.on("connect") { ( dataArray, ack) -> Void in
        print("connected to external server")
    }
}

func cloesSocketConnection() {
    self.socket.disconnect()
}

@objc func sendNewMessage() {
    let newMessageContent = newMessageInput.text!
    print("Sending message..." + newMessageContent)
    self.socket.emit("createMessage", newMessageContent)
}
}

主要错误:

代码语言:javascript
运行
复制
2018-02-07 17:53:33.809954-0500 chat-app[78163:6477441] [MC] Lazy 
loading NSBundle MobileCoreServices.framework
2018-02-07 17:53:33.811229-0500 chat-app[78163:6477441] [MC] Loaded 
MobileCoreServices.framework
2018-02-07 17:53:33.915820-0500 chat-app[78163:6477441] LOG 
SocketIOClient{/swift}: Handling event: statusChange with data: 
[connecting]
2018-02-07 17:53:33.916535-0500 chat-app[78163:6477441] LOG 
SocketIOClient{/swift}: Joining namespace /swift
2018-02-07 17:53:33.918305-0500 chat-app[78163:6477441] LOG 
SocketManager: Tried connecting socket when engine isn't open. 
Connecting
2018-02-07 17:53:33.918627-0500 chat-app[78163:6477441] LOG 
SocketManager: Adding engine
2018-02-07 17:53:33.921886-0500 chat-app[78163:6477498] LOG 
SocketEngine: Starting engine. Server: http://localhost:3000/chat.html?
name=developer&room=test
2018-02-07 17:53:33.922020-0500 chat-app[78163:6477498] LOG 
SocketEngine: Handshaking
2018-02-07 17:53:33.922060-0500 chat-app[78163:6477441] LOG 
SocketIOClient{/swift}: Adding handler for event: connect
2018-02-07 17:53:33.922966-0500 chat-app[78163:6477441] LOG 
SocketManager: Manager is being released
2018-02-07 17:53:33.924349-0500 chat-app[78163:6477498] LOG 
SocketEnginePolling: Doing polling GET 
http://localhost:3000/socket.io/?transport=polling&b64=1
2018-02-07 17:53:34.014299-0500 chat-app[78163:6477498] LOG 
SocketEnginePolling: Got polling response
2018-02-07 17:53:34.016531-0500 chat-app[78163:6477498] LOG 
SocketEnginePolling: Got poll message: 
97:0{"sid":"DRRfs3CyuXRDeYVIAAAA","upgrades":
["websocket"],"pingInterval":25000,"pingTimeout":60000}
2018-02-07 17:53:34.022590-0500 chat-app[78163:6477498] LOG 
SocketEngine: Got message: 0{"sid":"DRRfs3CyuXRDeYVIAAAA","upgrades":
["websocket"],"pingInterval":25000,"pingTimeout":60000}
2018-02-07 17:53:34.045912-0500 chat-app[78163:6477498] LOG 
SocketEngine: Writing poll:  has data: false
2018-02-07 17:53:34.046635-0500 chat-app[78163:6477498] LOG 
SocketEnginePolling: Sending poll:  as type: 2
2018-02-07 17:53:34.048335-0500 chat-app[78163:6477498] LOG 
SocketEnginePolling: Created POST string: 1:2
2018-02-07 17:53:34.049790-0500 chat-app[78163:6477498] LOG 
SocketEnginePolling: POSTing
2018-02-07 17:53:34.050572-0500 chat-app[78163:6477498] LOG 
SocketEngine: Engine is being released

第二错误:

代码语言:javascript
运行
复制
2018-02-07 17:53:37.918418-0500 chat-app[78163:6477441] LOG 
SocketIOClient{/swift}: Handling event: error with data: ["Tried 
emitting createMessage when not connected"]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-08 01:37:21

您应该将SocketManager声明为存储的属性,如果不是,将在viewDidLoad之后解除分配。

通过管理器创建的套接字由管理器保留。因此,至少必须维护对管理器的单个强引用,以保持套接字正常运行。

因此,您可以使用以下内容:

代码语言:javascript
运行
复制
class ViewController:UIViewController {
   //... stuff here ...//
   var manager:SocketManager?

   override func viewDidLoad() {
      super.viewDidLoad()
      self.manager = SocketManager(socketURL: URL(string: "http://localhost:3000/chat.html?name=developer&room=test")!, config: [.log(true), .compress])
   }

}

此外,请更改以下文件内的命令:

代码语言:javascript
运行
复制
func establishSocketConnection() {
    self.socket.on("connect") { ( dataArray, ack) -> Void in
        print("connected to external server")
    }
    self.socket.connect()
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48675629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档