Swift / iOs /套接字:如何接收套接字“事件免费”的数据?

我正在努力构build一个简单的基本的真正的聊天应用程序,使用苹果的SWIFT客户端部分和nodejs的服务器端。

我使用websockets库来pipe理客户端/服务器通信。

我很快注意到,似乎我无法捕捉来自我的服务器的数据,而无需启动事件。 我试图让我的应用程序支持双向聊天,一方面在xcode 7中从我的iOS模拟器发送/接收消息,另一方面在桌面web浏览器(firefox)中做同样的事情。

从两个部分创build的所有消息都成功注册在我的mongodb数据库(通过nodejs mongoose),但在iOs模拟器时,我devise了一个聊天界面,我需要重新启动模拟器,每次我想看到新的传入消息。

我的目标是:在iOs仿真器UI中实时显示来自firefox和iOS模拟器的所有传入消息,当然使用套接字 当我从我的浏览器发送消息到我的iOs应用程序,应该立即显示这一个。 当我从iOs用户界面发送信息的时候是这样的,但是从Firefox发出的信息却不是这样。

请,我需要一些帮助,以了解我的代码有什么问题(分三部分):

Xcode / Swift:

import Foundation import UIKit class ViewTwo: UIViewController,UITableViewDataSource,UITableViewDelegate,UITextFieldDelegate{ var lab : [String!] = []; var desc : [String!] = []; var dictionnary : [String:String!] = ["user": nil,"message" : nil]; var voidDict:[String:String!] = ["content" : "whatever"]; @IBOutlet var tableView: UITableView! @IBOutlet var txtField: UITextField! @IBAction func addMessage(sender: AnyObject) { self.lab.insert("Hello", atIndex: 0); self.desc.insert(txtField.text!, atIndex: 0); dictionnary["user"] = "hello"; dictionnary["message"] = txtField.text; SocketIOManager.sharedInstance.emit("saveChat", value: dictionnary); } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. self.tableView.estimatedRowHeight = 80.0; self.tableView.rowHeight = UITableViewAutomaticDimension; SocketIOManager.sharedInstance.emit("ready", value: voidDict); SocketIOManager.sharedInstance.socket.on("chat"){data, ack in SocketIOManager.sharedInstance.socket.removeAllHandlers(); for var i = 0; i < data[0].count; ++i{ let usr = data[0][i]["user"] as! String; let mess = data[0][i]["message"] as! String; self.lab.insert(usr, atIndex: 0); self.desc.insert(mess, atIndex: 0); } self.tableView.reloadData(); } socket.on("update"){data, ack in self.socket.removeAllHandlers(); } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return desc.count; } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomCell; cell.hello.text = self.lab[indexPath.row]; cell.descr.text = self.desc[indexPath.row]; return cell; } } 

服务器端(nodejs)

 io.on('connection', function(socket){ console.log("un utilisateur s'est connecté"); socket.on("ready",function(err,data){ Chat.find({},function(err,data){ if(err) throw err; socket.emit("chat",data); }) }) socket.on('login',function(data){ User.find({username:data.id,password:data.password},function(err,data){ if(err) throw err; if(data.length > 0){ socket.emit("message","true"); }else{ socket.emit("userNotFound","Sorry this user doesn't exists"); } }) }) socket.on('saveChat',function(data){ Chat.create({user:data.user,message:data.message},function(err){ if(err) throw err; Chat.find({},function(err,data){ if(err) throw err; socket.emit("chat",data); }) }); }); socket.on('data',function(data){ var entry = new Chat(data); entry.save(function(err){ if(err) throw err; }) socket.emit("update","saved successfully"); console.log("saved successfully !"); }) socket.on('save',function(data){ var entry = new User(data); entry.save(function(err){ if(err) throw err; socket.emit("saved","saved successfully"); console.log("saved successfully !"); }) }) }) 

桌面客户端(Firefox)

 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0-beta1/jquery.min.js"></script> <script type="text/javascript" src="http://localhost:8080/socket.io/socket.io.js"></script> <form action=""> Username <input type="text" class="username"> <br> Message <textarea name="" id="" cols="30" rows="10" class="message"></textarea> <input type="submit" value="send" class="send"> </form> <script> var socket = io.connect('http://localhost:8080'); var data = {}; $("form").on("submit",function(e){ e.preventDefault(); e.stopPropagation(); var usr = $(".username").val(); var message = $(".message").val(); data["user"] = usr; data["message"] = message; socket.emit("data",data); console.log(data); }); </script> 

显然,

 socket.emit("update","saved successfully"); 

没有迅速处理。 无论如何,我恐怕不知道在我的快速应用程序中哪里可以介绍这个事件,而无需启动事件或重新启动iOs模拟器。

感谢帮助。

       

网上收集的解决方案 "Swift / iOs /套接字:如何接收套接字“事件免费”的数据?"