【问题标题】:NodeJS Server Not Receiving Socket.emit() from Swift ClientNodeJS 服务器未从 Swift 客户端接收 Socket.emit()
【发布时间】:2017-05-10 05:39:05
【问题描述】:

我正在尝试用 NodeJS 后端快速构建一个非常简单的多人井字游戏。但是,当我尝试从我的 swift 客户端执行 socket.emit() 时,服务器无法识别它。

客户代码:

SocketIOManager:

import UIKit

class SocketIOManager: NSObject {
    static let sharedInstance = SocketIOManager()

    override init() {
        super.init()
    }

    var socket: SocketIOClient = SocketIOClient(socketURL: NSURL(string: "http://10.0.1.30:2000")! as URL)

    func connectToServer(completionHandler: @escaping (_ userList: [[String: AnyObject]]?) -> Void) {
        socket.emit("connectUser")

        socket.on("userList") { ( dataArray, ack) -> Void in
            completionHandler(_: dataArray[0] as? [[String: AnyObject]])
        }
    }

    func establishConnection() {
        socket.connect()
    }

    func closeConnection() {
        socket.disconnect()
    }
}

游戏场景:

import SpriteKit

class GameScene: SKScene {

    let screenSize = UIScreen.main.bounds
    var board = SKSpriteNode(imageNamed: "Board.png")

    var users = [[String: AnyObject]]()

    override func didMove(to view: SKView) {
        SocketIOManager.sharedInstance.connectToServer(completionHandler: { (userList) -> Void in
            DispatchQueue.main.async(execute: { () -> Void in
                if userList != nil {
                    self.users = userList!
                }
            })
        })

        board.size = CGSize(width: screenSize.width * 2/3, height: screenSize.width * 2/3)
        board.position = CGPoint(x: screenSize.width/2, y: screenSize.height/2)

        self.backgroundColor = UIColor.white
        self.addChild(board)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    }

    override func update(_ currentTime: TimeInterval) {

    }
}

服务器代码:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

var userList = [];

app.get('/', function(req, res){
    res.send('<h1>Tic-Tac-Toe Server</h1>');
});

http.listen(2000, function(){
    console.log('Listening on *:2000');
});

io.on('connection', function(clientSocket) {
    console.log('a user connected');

    clientSocket.on('disconnect', function() {
        console.log('user disconnected');
    });

    clientSocket.on('connectUser', function() {
        console.log('User with id ' + clientSocket.id + ' connected');

        var userInfo = {};
        var foundUser = false;

        for (var i = 0; i < userList.length; i++) {
            if (userList[i]["id"] == clientSocket.id) {
                userInfo = userList[i];
                foundUser = true;
                break;
            }
        }

        if (!foundUser) {
            userInfo["id"] = clientSocket.id;
            userList.push(userInfo);
        }

        io.emit("userList", userList);
        io.emit("userConnectUpdate", userInfo);
    });

});

特别是不起作用的消息是“connectUser”消息,但我尝试创建其他消息来测试它,但它们都不起作用。似乎服务器从未收到它们。

【问题讨论】:

  • 杰克,如果你在 2000 端口上监听并连接一个客户端,那么你在 2K 端口上有一个开放的通道。如果您想连接第二个客户端,那么它将无法连接到 2K,因为它已经很忙了?
  • 您可能想考虑使用 Multipeer 连接之类的东西来简化您的工作。看到这个SO问题和答案。 stackoverflow.com/questions/38567748/…

标签: node.js swift socket.io


【解决方案1】:

由于您没有使用 https (http://10.0.1.30:2000),可能您忘记在 iOS 项目的 Info.plist 文件中将 Allow Arbitrary Loads 设置为 YES

无论如何,我已经构建了一个有效的基本示例:

服务器端:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

var port = 5000;

io.on('connection', function(socket) {
  socket.on('message', function(data) {
    console.log('client sent a message: ' + data);
  });
});

http.listen(port, function() {
  console.log('server up and running at %s port', port);
});

客户端:

import UIKit
import SocketIO

class ViewController: UIViewController {

  let socket = SocketIOClient(socketURL: URL(string: "http://localhost:5000")!)

  override func viewDidLoad() {
    super.viewDidLoad()

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

      self.socket.emit("message", "Hello dear server from iOS.")
    }

    socket.connect()
  }

}

来自服务器的日志

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 2012-04-07
    • 2019-08-13
    • 2017-12-29
    • 1970-01-01
    相关资源
    最近更新 更多