2016-12-25 2 views
0

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.

+0

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

+0

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

Antwort

0

Da Sie kein https (http://10.0.1.30:2000) verwenden, wahrscheinlich vergessen haben zulassen Willkürliche Lasten einstellen zu JA in Ihrer Info.plist Datei auf Ihrem iOS-Projekt:

enter image description here

Sowieso I‘ habe ein grundlegendes Beispiel gebaut, die Arbeit ist:

Server-Seite:

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); 
}); 

Client-Seite:

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() 
    } 

} 

Logs von Server

enter image description here

Verwandte Themen