【问题标题】:Can't connect my swift app to node.js via socket.io无法通过 socket.io 将我的 swift 应用程序连接到 node.js
【发布时间】:2016-03-09 15:08:01
【问题描述】:

我需要通过 socket.io 将我的 iOS 应用 (swift) 连接到 node.js 服务器。我关注了socket.io official tutorial,但还是卡住了。

我正在尝试连接到服务器并简单地发出“身份验证”,但发出后我没有收到任何反馈。

我的快速代码

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: \($0.event), with items: \($0.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.

这个“Welcome to socket.io.”表示我已连接到服务器?

【问题讨论】:

  • 我刚刚意识到服务器端的socket.io是0.9版本的。这会是个问题吗?

标签: node.js swift socket.io


【解决方案1】:

问题是我的服务器正在运行 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-objchere

第 2 步: 在您的项目中导入 socket.IO-objc。 有用的帖子:https://stackoverflow.com/a/24005242/4220809

第 3 步: 安装依赖项(SocketRocket)。 使用 cocoapods 在我的 swift 项目中导入这个 Objective-C 库。 教程:Using Objective-C CocoaPods libraries with Swift

【讨论】:

  • 嗨,你在哪里找到连接这些堆栈的教程?我正在尝试连接 MySQL、Node.js 和 SwiftUI
猜你喜欢
  • 1970-01-01
  • 2017-11-13
  • 2016-09-20
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 2019-07-19
相关资源
最近更新 更多