无法通过 socket.io 将我的 swift 应用程序连接到 node.js
Can't connect my swift app to node.js via socket.io
我需要将我的 iOS 应用程序 (swift) 连接到 node.js服务器通过 socket.io。我跟着socket.io official tutorial,但我还是卡住了。
我尝试连接到服务器并简单地发出 "authentification",但发出后我没有收到任何反馈。
我的swift代码
class Socket{
var socket = SocketIOClient(socketURL: "localhost:8000", options:[.Log(true), .ForcePolling(true)])
init(){
self.addHandles()
self.socket.connect()
socket.connect()
self.socket.emit("authentification","gaamy#test")
}
func addHandles(){
self.socket.on("connect") {data, ack in
print("socket connected")
print(data)
}
self.socket.on("error") {data in
print("socket ERROR")
print(data)
}
self.socket.on("reponse connection") {data in
print("reponse connection")
print(data)
}
self.socket.onAny {
print("Got event: \([=13=].event), with items: \([=13=].items!)")
}
}
}
node.js socket.on:
io.sockets.on('connection', function (socket) {
socket.on('authentification', function(info) {
var res = info.split("#");
var username = res[0];
var password = res[1];
userModel.findOne({'username':username}, function(err, user){
if(err){
io.sockets.socket(socket.id).emit('reponse connection', 'false#Impossible de se connecter a la base de données');
io.sockets.socket(socket.id).disconnect();
}
else if(!user){
io.sockets.socket(socket.id).emit('reponse connection', "false#Nom d'utilisateur invalide");
io.sockets.socket(socket.id).disconnect();
}
else if (user.password == password){
var stringUsers = username;
for(var clef of userMap.keys()){
stringUsers = stringUsers + '+' + clef;
}
// pour eviter le doublon de username
if(typeof(userMap.get(username))==="undefined")
{
userMap.set(username, socket.id);
io.sockets.socket(socket.id).emit('reponse connection', 'true#' + stringUsers);
socket.broadcast.emit("userConnected",username);
socket.broadcast.emit("message", username+" Is Now Connected!");
socket.username = username;
socket.host = 0;
console.log(username,' Is Now Connected!');
}
else{
io.sockets.socket(socket.id).emit('reponse connection', "false#Nom d'utilisateur invalide");
io.sockets.socket(socket.id).disconnect();
}
}
else{
io.sockets.socket(socket.id).emit('reponse connection', 'false#Mot de pass invalide');
io.sockets.socket(socket.id).disconnect();
}
});
});
有Xcode输出:
2015-12-03 13:03:21.267 Projet3[26084:369975] Log SocketIOClient: Adding handler for event: reponse connection
2015-12-03 13:03:21.268 Projet3[26084:369975] Log SocketIOClient: Adding handler for event: error
2015-12-03 13:03:21.268 Projet3[26084:369975] Log SocketIOClient: Adding handler for event: connect
2015-12-03 13:03:21.269 Projet3[26084:369975] Log SocketIOClient: Adding engine
2015-12-03 13:03:21.271 Projet3[26084:369975] Log SocketEngine: Starting engine
2015-12-03 13:03:21.271 Projet3[26084:369975] Log SocketEngine: Handshaking
2015-12-03 13:03:21.272 Projet3[26084:369975] Log SocketEngine: Doing polling request
2015-12-03 13:03:21.399 Projet3[26084:370051] Log SocketEngine: Got polling response
2015-12-03 13:03:21.400 Projet3[26084:370051] Log SocketEngine: Got message: Welcome to socket.io.
这个“欢迎使用socket.io.”表示我已经连接到服务器了?
问题是我的服务器是 运行 socket.io v0.9 并且 socket.io-client-swift 支持 socket.io v1.0+。
我不能只更新我的服务器,因为另一个客户端是 运行 C# 并使用仅与 socket.io v0.9 兼容的 socketio4net。
解决方案是使用 socket.IO-objc 因为它支持 socket.io v0.9.
第 1 步:
获取 socket.IO-objc here.
第 2 步:
在您的项目中导入 socket.IO-objc。
有用post:
第 3 步:
安装依赖项(SocketRocket)。
使用 cocoapods 在我的 swift 项目中导入这个 objective-c 库。
教程:Using Objective-C CocoaPods libraries with Swift
我需要将我的 iOS 应用程序 (swift) 连接到 node.js服务器通过 socket.io。我跟着socket.io official tutorial,但我还是卡住了。
我尝试连接到服务器并简单地发出 "authentification",但发出后我没有收到任何反馈。
我的swift代码
class Socket{
var socket = SocketIOClient(socketURL: "localhost:8000", options:[.Log(true), .ForcePolling(true)])
init(){
self.addHandles()
self.socket.connect()
socket.connect()
self.socket.emit("authentification","gaamy#test")
}
func addHandles(){
self.socket.on("connect") {data, ack in
print("socket connected")
print(data)
}
self.socket.on("error") {data in
print("socket ERROR")
print(data)
}
self.socket.on("reponse connection") {data in
print("reponse connection")
print(data)
}
self.socket.onAny {
print("Got event: \([=13=].event), with items: \([=13=].items!)")
}
}
}
node.js socket.on:
io.sockets.on('connection', function (socket) {
socket.on('authentification', function(info) {
var res = info.split("#");
var username = res[0];
var password = res[1];
userModel.findOne({'username':username}, function(err, user){
if(err){
io.sockets.socket(socket.id).emit('reponse connection', 'false#Impossible de se connecter a la base de données');
io.sockets.socket(socket.id).disconnect();
}
else if(!user){
io.sockets.socket(socket.id).emit('reponse connection', "false#Nom d'utilisateur invalide");
io.sockets.socket(socket.id).disconnect();
}
else if (user.password == password){
var stringUsers = username;
for(var clef of userMap.keys()){
stringUsers = stringUsers + '+' + clef;
}
// pour eviter le doublon de username
if(typeof(userMap.get(username))==="undefined")
{
userMap.set(username, socket.id);
io.sockets.socket(socket.id).emit('reponse connection', 'true#' + stringUsers);
socket.broadcast.emit("userConnected",username);
socket.broadcast.emit("message", username+" Is Now Connected!");
socket.username = username;
socket.host = 0;
console.log(username,' Is Now Connected!');
}
else{
io.sockets.socket(socket.id).emit('reponse connection', "false#Nom d'utilisateur invalide");
io.sockets.socket(socket.id).disconnect();
}
}
else{
io.sockets.socket(socket.id).emit('reponse connection', 'false#Mot de pass invalide');
io.sockets.socket(socket.id).disconnect();
}
});
});
有Xcode输出:
2015-12-03 13:03:21.267 Projet3[26084:369975] Log SocketIOClient: Adding handler for event: reponse connection
2015-12-03 13:03:21.268 Projet3[26084:369975] Log SocketIOClient: Adding handler for event: error
2015-12-03 13:03:21.268 Projet3[26084:369975] Log SocketIOClient: Adding handler for event: connect
2015-12-03 13:03:21.269 Projet3[26084:369975] Log SocketIOClient: Adding engine
2015-12-03 13:03:21.271 Projet3[26084:369975] Log SocketEngine: Starting engine
2015-12-03 13:03:21.271 Projet3[26084:369975] Log SocketEngine: Handshaking
2015-12-03 13:03:21.272 Projet3[26084:369975] Log SocketEngine: Doing polling request
2015-12-03 13:03:21.399 Projet3[26084:370051] Log SocketEngine: Got polling response
2015-12-03 13:03:21.400 Projet3[26084:370051] Log SocketEngine: Got message: Welcome to socket.io.
这个“欢迎使用socket.io.”表示我已经连接到服务器了?
问题是我的服务器是 运行 socket.io v0.9 并且 socket.io-client-swift 支持 socket.io v1.0+。
我不能只更新我的服务器,因为另一个客户端是 运行 C# 并使用仅与 socket.io v0.9 兼容的 socketio4net。
解决方案是使用 socket.IO-objc 因为它支持 socket.io v0.9.
第 1 步: 获取 socket.IO-objc here.
第 2 步: 在您的项目中导入 socket.IO-objc。 有用post:
第 3 步: 安装依赖项(SocketRocket)。 使用 cocoapods 在我的 swift 项目中导入这个 objective-c 库。 教程:Using Objective-C CocoaPods libraries with Swift