0
NodeJSバックエンドを使用して、非常に単純なマルチティックタックトゥーゲームを迅速に組み合わせようとしています。私がしようとすると私の迅速なクライアントからsocket.emit()、しかし、サーバーはそれを認識しません。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" 1つですが、テストするために他のものを作成しようとしましたが、どれも動作しません。サーバーが受信しないかのように見えます。
ジェイク、ポート2000でリスニング場合は、クライアントを接続し、その後、あなたはポート2Kで開いたチャネルを持っています。 2Kに接続できないために2番目のクライアントに接続する場合は、すでにビジー状態です。 – user3069232
ジョブを簡単にするために、マルチペラ接続のようなものを使うことを考えてみてください。このSOの質問と回答を見てください。 http://stackoverflow.com/questions/38567748/how-to-create-a-pkcs12-compatible-with-ioss-multipeer-connectivity-with-node-fo – user3069232