当前位置: 首页 > 面试题库 >

swift4 iOS的Socket.io

周学义
2023-03-14
问题内容

我在如何对我的快速代码实现websocket功能时遇到麻烦。

我已经完成了服务器实施和另一个javascript客户端。他们工作得很好。因此,我相信websocket服务器没有错。

但是,如果我迅速编写代码,那是行不通的。没有错误发生,并且控制台上未显示任何消息。

这是我的快速代码。

import UIKit
import SocketIO

class ChatViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate {


    @IBOutlet weak var tableView: UITableView!

    var bottomView: ChatRoomInputView!

    var chats: [ChatEntity] = []

    var socket: SocketIOClient!

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self

        // Initialize WebSocket
        let manager = SocketManager(socketURL: URL(string: "http://example.com:8081")!, config: [.log(true), .compress])
        socket = manager.defaultSocket

        socket.on(clientEvent: .connect) {data, ack in
            print("socket connected")
        }

        socket.on("server_to_client") {[weak self] data, ack in
            print ("get Massage!!!")
        }

        socket.connect()

        socket.emit("join_room", with: [getRegistrationId()])
        socket.emit("client_to_server", with: ["ack_client"])

        setupUI()
    }


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

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    }

    override var canBecomeFirstResponder: Bool {
        return true
    }

    override var inputAccessoryView: UIView? {
        return bottomView
    }

    func setupUI() {
        self.view.backgroundColor = UIColor(red: 113/255, green: 148/255, blue: 194/255, alpha: 1)
        tableView.backgroundColor = UIColor(red: 113/255, green: 148/255, blue: 194/255, alpha: 1)

        tableView.separatorColor = UIColor.clear
        tableView.estimatedRowHeight = 10000
        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.allowsSelection = false
        tableView.keyboardDismissMode = .interactive

        tableView.register(UINib(nibName: "YourChatViewCell", bundle: nil), forCellReuseIdentifier: "YourChat")
        tableView.register(UINib(nibName: "MyChatViewCell", bundle: nil), forCellReuseIdentifier: "MyChat")

        self.bottomView = ChatRoomInputView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 60))
        bottomView.chatTextField.delegate = self
        bottomView.textSendButton.addTarget(self, action: #selector(self.chatTextSendButton(_:)), for: .touchUpInside)

    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.chats.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let chat = self.chats[indexPath.row]
        if chat.isMyChat() {
            let cell = tableView.dequeueReusableCell(withIdentifier: "MyChat") as! MyChatViewCell
            cell.clipsToBounds = true
            // Todo: isRead
            cell.updateCell(text: chat.text, time: chat.time, isRead: true)
            return cell
        } else {
            let cell = tableView.dequeueReusableCell(withIdentifier: "YourChat") as! YourChatViewCell
            cell.clipsToBounds = true
            cell.updateCell(text: chat.text, time: chat.time, pic: RemoshinData.getDoctorPic())
            return cell
        }
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print(indexPath)
    }

    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return 10
    }


    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

    func textFieldShouldClear(_ textField: UITextField) -> Bool {
        return true
    }

    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        textField.inputFieldBorderBottom(color: Utils.getColor(),
                                     x: textField.center.x,
                                     y: textField.center.y,
                                     w: textField.frame.size.width,
                                     h: textField.frame.size.height)
        bottomView.chatTextField = textField
        return true
    }
    func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
        textField.inputFieldBorderBottom(color: UIColor.lightGray,
                                     x: textField.center.x,
                                     y: textField.center.y,
                                     w: textField.frame.size.width,
                                     h: textField.frame.size.height)
        return true
    }


    @objc func chatTextSendButton(_ sender: AnyObject) {
        let chatText = bottomView.chatTextField.text!

        if (chatText != "") {
            let _mainViewController = MainViewController()
            let jsonData = _mainViewController.sendChatText(_registration_id: getRegistrationId(), _chat_text: chatText)

            if(jsonData["status"].string! == "success") {
                socket.emit("client_to_server", with: ["update_chat"])

                let chat = ChatEntity(text: jsonData["chat_text"].string!, time: "", userType: .I)
                chats.append(chat)
                tableView.reloadData()

                bottomView.chatTextField.text = ""
            }
        }
    }
}

应用运行时,我想在控制台上看到“ socket
connected”消息。我认为插座有问题。但是我不知道哪里出了问题,因为没有发现错误消息。而且我怀疑我是否需要在info.plist中进行一些设置。但是,我没有道理怎么写。

请给我一些建议吗?


问题答案:

socket.io-client-swift

var manager:SocketManager!

var socketIOClient: SocketIOClient!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    ConnectToSocket()
}

func ConnectToSocket() {

    manager = SocketManager(socketURL: URL(string: "your url")!, config: [.log(true), .compress])
    socketIOClient = manager.defaultSocket

    socketIOClient.on(clientEvent: .connect) {data, ack in
        print(data)
        print("socket connected")
    }

    socketIOClient.on(clientEvent: .error) { (data, eck) in
        print(data)
        print("socket error")
    }

    socketIOClient.on(clientEvent: .disconnect) { (data, eck) in
        print(data)
        print("socket disconnect")
    }

    socketIOClient.on(clientEvent: SocketClientEvent.reconnect) { (data, eck) in
        print(data)
        print("socket reconnect")
    }

    socketIOClient.connect()
}

更新资料

在您的情况下: SocketManager:正在释放管理器

通过管理器创建的套接字由管理器保留。因此,至少必须维护对管理器的单个强引用,以使套接字保持活动状态。

[“从服务器欢迎到socket.io,出现未知错误。”]

  1. 在服务器和客户端上检查socket.io版本,两者不匹配可能是此错误的原因
  2. 在info.plist(词典类型)中添加“应用程序传输安全设置”键,并在子键“允许任意负载”(布尔类型)中添加YES值。


 类似资料:
  • 问题内容: Socket.io的自述文件包含以下示例: 和之间有什么区别? 问题答案: 广播在给定房间中所有的插座, 除外 到它被调用而插座广播在给定房间内的所有插座。

  • 问题内容: 因此,我最近一直在尝试了解Socket.io,但是我不是一个非常出色的程序员,并且几乎可以在网络上找到的每个示例(相信我已经花了数小时的时间)都包含使事情变得复杂的额外内容。许多示例都会使我感到困惑,或者连接到一些奇怪的数据库,或者使用coffeescript或大量的JS库将事情弄乱了。 我很乐意看到一个基本的,可以正常运行的示例,其中服务器仅每10秒向客户端发送一条消息,说明现在几点

  • 我试图提供静态文件的ngin x 1.6和代理套接字流量来自Node.js网络服务器与socket.io。 这是nginx.conf的相关部分: 它直接在浏览器和 Node.js 之间完美运行,但使用 nginx 1.6 代理时 socket.io 时间太长。握手协议需要太多时间,但如果不间断,它最终会在几分钟后开始工作。 nginx的静态文件交付工作得很好。 会有什么问题呢? 更新: 我分析了一

  • 问题内容: 我有一个使用laravel用PHP编写的Web应用程序。 现在,我必须添加实时通知系统,该系统可以从服务器->客户端推送消息,并且可以检索从客户端->服务器推送的消息。 由于Socket.IO向后兼容且性能下降,因此我想将其用于WebSocket / AJAX轮询部分。 问题是默认情况下Socket.IO可与Node.JS后端一起使用。 我具有对服务器的root访问权限,并行运行(Ap

  • 问题内容: 我正在尝试使用我的SSL证书运行socket.io,但是它将无法连接。 我基于聊天示例创建代码: 如果我删除SSL代码,它运行正常,但是与此同时,我收到了一个请求,请求http://domain.com/socket.io/1/?t=1309967919512 请注意,它没有尝试使用https,这会导致它失败。 我正在测试chrome,因为它是该应用程序的目标浏览器。 抱歉,这是一个简

  • 我用Node.js设置了Socket.io,它通过侦听/连接到端口8000(或另一个不是服务器运行端口的端口)在本地开发机器上工作。 当我试图在heroku上做同样的事情时,客户端脚本导入失败了。 我尝试过相对路径 编辑:我实际上是在使用geddy mvc框架,我想让它在heroku上如何设置(基本上就像socket.io一样),我发现这个答案让我看起来可以类似地使用它:GeddyJS&socke