2016-12-25 14 views
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つですが、テストするために他のものを作成しようとしましたが、どれも動作しません。サーバーが受信しないかのように見えます。

+0

ジェイク、ポート2000でリスニング場合は、クライアントを接続し、その後、あなたはポート2Kで開いたチャネルを持っています。 2Kに接続できないために2番目のクライアントに接続する場合は、すでにビジー状態です。 – user3069232

+0

ジョブを簡単にするために、マルチペラ接続のようなものを使うことを考えてみてください。このSOの質問と回答を見てください。 http://stackoverflow.com/questions/38567748/how-to-create-a-pkcs12-compatible-with-ioss-multipeer-connectivity-with-node-fo – user3069232

答えて

0

あなたはおそらく、あなたのiOSプロジェクトであなたInfo.plistファイル内の任意のロード YES に許可を設定するのを忘れて、(http://10.0.1.30:2000)をHTTPSを使用していないので。とにかく

enter image description here

私は」基本的な例を作成しました。

サーバー側:

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

} 

ログ

enter image description here

関連する問題