問答収集 カテゴリ:Flashプログラミング
現在のスレッド一覧 / 新規に質問を投稿
レス数:7 / 状態:未解決 / No:84 / ATOM
1 名前:木箱 日付:2010/12/08(水)09:45:40 ID:UBoObCjSaiWU
当HPでいつも勉強させていただいております。
Javaを使ったXMLSocket通信について
のチャプターですが、いわゆるローカルIPアドレスでの通信は成功します。

しかし、グローバルIPアドレスでの通信のやり方がわかりません。
今のままグローバルIPアドレスを入力してもエラーになってしまいます。
ぜひご教授ください!よろしくお願いします。
2 日付:2010/12/08(水)13:10:42 ID:PCZN.8//kWPU
接続したいPCがローカルネットワーク(LAN)内に存在するという事であれば
ルータに設定の追加が必要になると思います。

ルータを購入してから設定を特に変更していないのであれば、
大抵は外部(WAN側)からの通信はすべて遮断されている状態となっています。


「グローバルIPアドレス」によりルータまで到達します。そこから先は「ポート番号」により
「ローカルネットワーク内(LAN側)のどのPCと接続するか」が決定し振り分けられる事になります。

という事でルータに対して
「外部(WAN側)から任意のポート番号でアクセスがあれば、ローカル(LAN側)の任意のPC(ローカルIPアドレス)に接続する」
という感じの設定を追加する事になります。


肝心の設定方法ですが、ルータの機種によって
「ポートフォワード」や「静的IPアドレス変換設定」「ローカルサーバ」「アドレス変換」
「静的IPマスカレード」「アドレス・ポート変換」などさまざまな呼び方があるようです。

「ルータの機種名」と「ポート開放」などの用語で検索してみて下さい。
メジャーな機種であれば設定方法が解説されてるかもしれません。

また、セキュリティリスクを伴いますのでご注意下さい。
3 名前:木箱 日付:2010/12/10(金)02:19:21 ID:UBoObCjSaiWU
詳細な解説ありがとうございます。
さっそく書かれている静的IPマスカレードについて調べてやってみました。

【ルーター設定】
NTT PR-S300SE

トップページ > 詳細設定 > 静的IPマスカレード設定 > エントリ編集
エントリ番号6
優先順位1
接続インタフェース名メインセッション(ISP1)
宛先IPアドレス192.168.1.5
変換対象IPアドレス○自分のWAN側IPアドレス
  IPアドレス指定 
変換対象プロトコルTCP
宛先ポート8080
変換対象ポート8080

プログラムは
http://hakuhin.jp/as/xml_socket.html#XML_SOCKET_00
一番最初のサンプル
http://hakuhin.jp/download/as1/xml_socket_00_fla05_as1.zip
です。コードはアドレスの文字列以外全く変えていません。
サーバープログラムとクライアントプログラムは同じPC上です。

"127.0.0.1"またはローカルIPアドレス"192.168.1.5"を入力して実行すると接続成功しますが
グローバルIPアドレス"111.234.***.***"を入力して実行すると"接続失敗"となります。
(結果は最初と同じ内容です。)

サーバーを起動したままポート8080を調べると開放されていますと出ます。
ちなみにルーターの設定には
 DNS設定
  DHCPv4サーバ設定
  セキュリティ設定
  静的IPマスカレード設定
  静的NAT設定
  LAN側静的ルーティング設定
  高度な設定
などの項目もあります。

どこかおかしいでしょうか?
4 日付:2010/12/10(金)18:45:54 ID:PCZN.8//kWPU
ルータへのポート番号の設定以外としては
セキュリティの為にポリシーファイルを実装する必要があります。
http://hakuhin.jp/as/xml_socket.html#XML_SOCKET_06


まず、Flash から、System.security.loadPolicyFile() メソッドを呼び出して
ポリシーファイルを要求するためにサーバーにアクセスします。

サーバーは、"<policy-file-request/>" という文字列を受信することになります。
この文字列が送られてきた場合、クライアントがポリシーファイルを要求しているので
ポリシーファイルに記述すべき XML 文書を文字列としてクライアントに送信して、ひとまず切断します。

Flash はサーバーから送られてきたポリシーファイルの文字列に従い、
アクセスが許可されていれば自動的にサンドボックスが解除されます。
ここではじめて普通に接続を行うことができます。


という事で、
Flash 側に「ポリシーファイルの要求の送信」、
サーバー側に「ポリシーファイル要求の受付」と「ポリシーファイルの送信」を実装する必要があります。

また、ルータには
「ポリシーファイルの要求を受け付けるためのポート番号」と
「通常の通信をするためのポート番号」
以上の2つのポートを開放する必要があります。
5 名前:木箱 日付:2010/12/11(土)09:02:23 ID:UBoObCjSaiWU

詳細な解説ありがとうございます。後で解説があったのですか、未だそこまで読んでいませんでした。
さっそく上記のリンクのコードをサーバーとクライアントに使ってみました。

>また、ルータには
>「ポリシーファイルの要求を受け付けるためのポート番号」と
>「通常の通信をするためのポート番号」
>以上の2つのポートを開放する必要があります。

という部分について色々試行してみたのですが分かりません。
ポート番号は二つ(例えば8080と8081等)開けるということなのでしょうか?
とすると、リンクのサンプルコードにおいてクライアント側には確かにポリシーファイルと普通の通信を要求するコードがありますので

・System.security.loadPolicyFile("xmlsocket://111.234.***.***:8081");
・socket.connect("111.234.***.***", 8080);

と分けることが出来ます。
しかしサーバープログラムにおいては

・ServerSocket sarver = new ServerSocket(8080);

の1箇所しかポート番号について明記されていません。
いかにして2つのポートを開放するのでしょうか?ルーターの設定でしょうか?
6 日付:2010/12/11(土)12:40:35 ID:8d7uAYrQHgxE
すみません。
サンプルだと、8080ポートのみを使って、
「ポリシーファイルの要求の受け付け」と「通常の通信」の両方を行っています。
ですので1つのポートを開放するだけで大丈夫です。

「ポリシーファイルの要求の受け付け」と「通常の通信」を
2つのサーバに分離して別々に処理したいときは
2つのポートを開放する必要があります。
7 名前:木箱 日付:2010/12/16(木)11:34:06 ID:ZVtP6NXvOhih
解説ありがとうございます。

解決はしていないのですが、ルーターのメーカーに電話して聞いたところ、同じルート内にサーバーとクライアントがあるとグローバルアドレスでは通信できないそうです。
一応その方向で先に試してみたいと思います、またつまりましたら質問させていただくこともあるかと思います、よろしくお願いいたします。
このスレッドについて
質問の状態 :
未解決
投稿開始日 :
2010/12/08(水)09:45:40
投稿終了日 :
2010/12/16(木)11:34:06
投稿者 :
木箱
レス総数 :
7
スレッド番号 :
84
MondoCollectionSystem ver.0x00020000 by Hakuhin