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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

1回答

2602閲覧

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

Susanoo2442

総合スコア153

Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/07/27 10:32

質問です。

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

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...");

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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/27 22:17

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Susanoo2442

2016/07/28 14: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サーバーに接続する事が出来ます。
Susanoo2442

2016/07/28 14:51

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

2016/07/29 07: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が通らなかったらプログラミングの問題以前のネットワーク環境の問題ということになります。 もし会社のネットワーク環境を使ってテストしているんだったら、まずはその会社のネットワーク管理者に確認することをお勧めします。
Susanoo2442

2016/07/29 17:08

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問