質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.80%

iPhone実機シュミレーションに関して

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,840

score 149

質問です。

現在、リアルタイム双方向通信を可能とした
チャットアプリを作成中なのですが

X-codeのiPhoneシュミレートだとうまくServer.jsに接続できるのですが
実機シュミレートだと、なぜか、サーバーに接続することができません。

下記のものが、実際のコードでございます。

Swift

import UIKit
import SocketIOClientSwift
import QuartzCore

class ViewController: UIViewController {

    let SocketURL = NSURL(string:"http://192.168.33.10:8080/")
    var socket: SocketIOClient!

    @IBOutlet weak var sigoku: UITextField!








    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.


        //socket = SocketIOClient(socketURL: SocketURL!, options: [.Log(true)]);

        //socket = SocketIOClient(socketURL: NSURL(string: "http://localhost:8080/")!,  options: [.Log(true)]);


        /*socket.on("connect") { data in
            print("socket connected!!")
        }
        socket.connect()*/



         //socket = SocketIOClient(socketURL: NSURL(string: "http://localhost:8080")!, options: [.Log(true), .ForcePolling(true)])


         //sigoku.layer.borderWidth = 2.0


         //sigoku.layer.borderColor = UIColor.().CGColor




        socket = SocketIOClient(socketURL: SocketURL!, options:[.Log(true), .ForcePolling(true)])




        socket.on("connect") { data, ack in
            print("socket connected!!")
        }
        socket.on("disconnect") { data, ack in
            print("socket disconnected!!")
        }










        self.socket.connect()
    }










    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func baki(sender: AnyObject) {




        let nume : String = self.sigoku.text!

        self.socket.emit("subaki",nume)


    }


}

Node.js+Socket.IO

var http = require("http");
var socketio = require("socket.io");
var fs = require("fs");
var server = http.createServer(function(req,res){
  res.write("hello world");
  res.end();
});

var LISTEN_IP = '192.168.33.10';

var LISTEN_PORT = 8080;



var io = require('socket.io')(server);


io.sockets.on('connection',function(socket){

console.log("client connected!!")

socket.on('disconnect',function() {


console.log("client disconnected")

});

socket.on("subaki", function(nume){
       console.log(nume)
   });

});




server.listen(LISTEN_PORT, LISTEN_IP);


console.log("server listinnig...");

以上になりますが
なにか、思い当たる点などありましたら
ぜひ、ご指摘して頂きたく思います。

それでは、宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

「実機シュミレート」と言っているのは、たぶん「実機で動作させた場合」という意味なのだろうと思います。

先にちょっとつっこませていただくと、
「simulate」は
「シュミレート」ではなくて
「シミュレート」で、
その意味は「まねする」とか「模擬する」とかいう意味です。
Xcodeに付属している「Simulator」は、Mac上でiPhone実機のまねをして動作するツールで、「実機シミュレート」と書くと、本来はそのiPhone実機をシミュレートする「Simulator」で動作させることを意味します。
文脈より、そうではなくて「実機で動作させた場合」ということを言いたいのだろうと推測しました。

で、本題の質問の方ですが、気になるのはiPhone実機をどのようにしてネットに接続しているかです。
モバイル通信回線で通信会社に接続しているなら、通信会社を経由して自分のテストサーバーの「http://192.168.33.10:8080/」に接続することはできません。
実機iPhoneで自分のテストサーバー「http://192.168.33.10:8080/」に接続したいなら、そのテストサーバーと同じLANに無線LANで接続する必要があります。
もし同じLANに接続してテストしているのに接続できないのなら、どこかにエラーメッセージが表示されていると思うので、そのエラーメッセージを書いてください。

最終的には、node.jsを動作させることができる外部のレンタルサーバーが必要になると思いますので、レンタルサーバーを契約してnode.jsをインストールし、そのレンタルサーバーに接続すればモバイル通信回線経由でもテストできます。とはいえ、外部のサーバーは不特定多数の人がアクセスできる場所ですのでセキュリティには十分注意する必要があります。少なくとも一度は内部のテストサーバーでテストして、意図通り動作することをきちんと確認してから外部のレンタルサーバーを使うことをお勧めします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/28 23:50

    回答ありがとうございます。

    iPhoneもMacも同一のLAN内に
    アクセスしております。

    ちなみに、192.168.33.10というのはNode.jsサーバーのIPアドレスでございます。
    私がアクセスしている無線ルーターのIPアドレスは192.168.11.5になります。

    しかしながら、無線ルーターのIPアドレスでサーバーを待ち受けても
    エラーが出てNode.jsサーバー自体が立ち上がりません。

    iPhoneのキャッシュを削除したり、Macのファイヤウォールを切断するなどいろいろ試しましたが、結局繋がりません。ちなみにX-codeのシミュレートでは問題なくNode.jsサーバーに接続する事が出来ます。

    キャンセル

  • 2016/07/28 23:51

    エラー内容は"Tried emitting subaki when not connected"になります。

    キャンセル

  • 2016/07/29 16:43

    サーバーのIPアドレスが192.168.33.10で、無線ルーターのIPアドレスが192.168.11.5ということは、サーバーと無線ルーターは別のサブネットにいるわけですが、無線LAN接続したiPhoneがちゃんとサーバーに接続できるよう、ルーターの設定等きちんとされているんでしょうか?
    問題を切り分けるために
    https://itunes.apple.com/jp/app/network-ping-lite/id289967115?mt=8
    にあるようなpingアプリをiPhoneにインストールして、iPhoneからサーバーに接続できるようになっているか確認してみることをお勧めします。pingが通らなかったらプログラミングの問題以前のネットワーク環境の問題ということになります。
    もし会社のネットワーク環境を使ってテストしているんだったら、まずはその会社のネットワーク管理者に確認することをお勧めします。

    キャンセル

  • 2016/07/30 02:08



    いつも、回答ありがとうございます。

    今回、Charlesというソフトを使用する事で無事
    iPhoneからNode.jsサーバーに接続してクライアントとサーバーからリアルタイム双方向通信を行う事が出来ました。

    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る