Ich versuche, ein sehr einfaches Multiplayer-Tic-Tac-Toe-Spiel in Swift mit einem NodeJS-Backend zusammenzustellen. Wenn ich socket.emit() von meinem schnellen Client versuche und mache, erkennt der Server dies jedoch nicht.NodeJS Server nicht Socket.emit() von Swift Client
Client-Code:
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()
}
}
Spiel-Szene:
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) {
}
}
Server-Code:
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);
});
});
Die Nachricht insbesondere die nicht arbeitet, ist die "connectUser", aber ich habe versucht, andere zu erstellen, um es zu testen und keiner von ihnen funktioniert. Es scheint, als ob der Server sie nie empfängt.
Jake, wenn Ihr lauscht auf Port 2000 und ein Client eine Verbindung herstellen, dann haben Sie einen offenen Kanal auf Port 2K . Wenn Sie einen zweiten Client verbinden möchten, kann er nicht mit 2K verbinden, weil er bereits besetzt ist? – user3069232
Sie könnten über etwas wie Multipeer Konnektivität denken, um Ihre Arbeit zu erleichtern. Sieh diese SO Frage und Antwort. http://StackOverflow.com/Questions/38567748/How-to-create-a-pkcs12-kompatibel-mit-Iss-Multipeer-connectivity-mit-Node-fo – user3069232