• ベストアンサー

非同期xmlhttprequestでのポート指定

今、デスクトップアプリケーションをapacheを経由してブラウザで操作できるような仕組みを作っております。もとのデスクトップアプリがjavaで実装されており、そこではsocketを特定のポートでオープンしています。 serverSocket = new ServerSocket(3811); socket = serverSocket.accept(); そして、ブラウザの方ではYUIのスライダーを利用したUIをつくっており、そのスライダーの値が変更されると、 var httpObj = new XMLHttpRequest(); httpObj.open("POST","http://localhost:3811",true); httpObj.send("value="+val); というように送信しています。 現状ではc://*****/***/****.htmlという形で、apacheを介さずに、同じマシン上でアクセスした場合、メッセージングが正常に行われていることを確認することができたのですが、 http://localhost/****.htmlの形でapacheを経由してアクセスした場合、メッセージングができません。 onreadystatechangeも呼び出されなく、また、netstat等でコネクション確認をしてみましたが、まったくコネクションが貼られていない状態です。apacheがなんらかのフィルタリングをおこなっているようにも思えるのですが、様々な資料にあたってみましたが、まったくそれらしき記述を見つけることができずにいます。 どなたか、アドバイスをいただける方がいらっしゃいましたら、ヒントだけでも結構ですので、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • haraga
  • ベストアンサー率56% (36/64)
回答No.2

おもしろそうだったので実験してみました。 結果 ie5.5、ie6 はできました。ie7はできません。(win) mozilla系はできません ポート指定でエラーになっているようです。 この手のデバッグは(http://localhost)では無理です。 サーバーとクライアントを別にして、ネットワークモニタを使うと原因究明が早いです。

maestro78
質問者

お礼

調査していただきありがとうございます。じつは便宜上windowsで実行しているように書きましたが、OSXでsafariを利用しています。 結論からいいますと、この問題は最終的にはapache、ブラウザのかなり低レベルなところまで調査する必要があったので、別の方法で解決することにしました。 近年ではxmlhttprequestから別ホスト、別ポートへのリクエスト送信は不可とするようになっているようで、ie7でできなかったのも、その線ではないかと思われます。 解決策として実行したのは、apacheのProxyPassディレクティブを利用して、あくまで同ホスト、同ポートにリクエストをおくるのだが、apacheでそれをそのまま転送するという形をとりました。この対応で多少のレイテンシーが発生すると考えられますが、現状はさほど影響を感じません。今後調査していこうと思います。ネットワークモニタでもその際に、実際に監視してみようと思います。 このたびは貴重なアドバイスありがとうございました。

その他の回答 (1)

回答No.1

私は実験していません。(ネットワークプログラミングの経験が無いため) 他のブラウザ含めどうなるか試してはいない。 しかし、IEを使っているなら, 例えばMSDNを見ると以下のように書かれています http://msdn2.microsoft.com/en-us/library/ms536648.aspx Security Alert : Cross-domain, cross-port, and mixed protocol requests are not allowed. The sUrl parameter may only specify XML data files in the same domain, using the same port and protocol method, as that from which the page is served. セキュリティ警告:クロスドメイン・クロスポート・および複数のプロトコルの混在は許可されていない。sURLパラメータはそのページが提供されたのと同一ドメイン,同一ポート,同一プロトコルの同一メソッドを使ってXMLファデータファイルを指定するのみである。 という記述があります。 ==== ローカルファイルで何故出来たかは俺は良く解らん。解らんばかりですまんけど、参考になれば。

maestro78
質問者

お礼

ご指摘ありがとうございます。 クロスポートのメッセージングが禁止されている件ですが、近年どのブラウザもそうなっているようですね。上記でもうしあげましたが、わたしはsafariを使っていました。 ほんと、なんでローカルファイルでは実行可能なのか、さっぱりわかりません。apacheのソースコードをみることしかないのかも知れないとも思いましたが、さすがにそこまでは手に負えないということで、上記の対応を行いました。 このたびは参考になるご意見、本当にありがとうございました。

関連するQ&A

  • 【ajax】 XMLHttpRequestオブジェクトを作成し連続でsend

    連続して非同期の通信を行う方法が分からず困っています。 下のようなコードを書きました。 クライアントからサーバにある「hoge1.txt」をGETするというものです。 その処理を行う関数(httpXMLRequest)を一つだけ呼び出すとうまくいきます。しかし二つ目に読み込んだ処理が実行されません。 同時に、というのは無理なのでしょうか。。 --------             ・             ・             ・ httpXmlRequest('hoge1.txt','GET','',dspXMLElement,httpError) //httpXmlRequest('hoge2.txt','GET','',dspXMLElement,httpError) } function httpXmlRequest \ (target_url,method,data,success_func,error_func){ httpObj=new XMLHttpRequest() timerId=setInterval('timeoutCheck()',1000) httpObj.open(method,target_url,true) httpObj.onreadystatechange=function(){ if(httpObj.readyState==4){ clearInterval(timerId) if(httpObj.status==200){ success_func(httpObj.responseXML) httpObj.abort() } else{ erro_func(httpObj.status+':'+httpObj.statusText) return false } } } httpObj.send(data) } 以上、よろしくおねがいします。

  • XMLHttpRequest 外部ソースの取得

    外部サーバーのHTMLソースを取得することが出来ないのでしょうか? (仮)ヤフーさんの場合 var req = new XMLHttpRequest(); req.open('GET', 'http://www.yahoo.co.jp', false); req.send(null); var str = req.responseText; こちらapache(Localhost)の環境で作成しています。 XMLHttpRequest Level2との記載もあるのですが・・ 初心者ですが宜しくお願いします。

  • XMLHttpRequestのブラウザ対応

    JavaScriptで、あるURLの結果を取得しようと以下のようなスクリプトを組みました。 var xmlHttp = false; function loadText(){ xmlHttp = new XMLHttpRequest(); xmlHttp.open("GET", "http://hogehoge, true); xmlHttp.onreadystatechange = checkStatus; xmlHttp.send(null); } function checkStatus(){ if (xmlHttp.readyState == 4 && xmlHttp.status == 200){ res = xmlHttp.responseText; alert(res); } } IE8では、結果が取得できたのですが、firefox4.0.1,Chromeでは取得できませんでした。 xmlHttp.status が0となってしまいました。 ただし、GET対象のURLをローカルサーバにすると、取得することができました。 firefox4.0.1,Chromeのブラウザの設定なのでしょうか?それともスクリプトの書き方に問題があるのでしょうか? すみませんが、教えてください。

  • XMLHttpRequestオブジェクトによるレスポンスを複数回受けるには?

    以下のようなコードでXMLHttpRequestを試しているのですが、 「レスポンスです。」と表示した後、 いったん違うページに遷移し、再度以下のコードを書いたページに遷移しても 「レスポンスです。」と表示されません。 var obj = new XMLHttpRequest(); obj.open("GET","/test.txt"); obj.setRequestHeader(~略~); obj.send(""); obj.onreadystatechange = function( ){   if(obj.readyState == 4){     alert(obj.responseText);   } } -------以下、test.txt-------- レスポンスです。 ----------------------------- ブラウザを閉じ、再びこのコードの書かれたページを表示すると「レスポンスです。」と表示されます。 ブラウザを閉じなくても、ページを表示する度に「レスポンスです。」と表示するにはどうすればよいのでしょうか?

  • ポートフォワーディングのローカルフォワードのTCP

    ポートフォワーディングのローカルフォワードのTCPのコネクション数について。 ローカルpcから踏み台サーバ経由で目的のサーバにhttpでアクセスする場合を考えます。 OSは関係ないと思いますが、ここではローカルpcはWindows、それ以外はlinuxとします。 まずはsshコマンドで # ssh 踏み台サーバ -L 10080:目的サーバ:80 でポートフォワーディングします。 ローカルpcのブラウザから http://localhost:10080 へアクセスすると目的サーバへ転送される認識です。 この時、ブラウザの複数のタブで同一URLにアクセスしても接続は可能ですか? 私の考えではhttpのレスポンスの宛先ポートがsshのトンネルのせいでブラウザのどのタブに紐づくポートへ返していいか判断できないのではないかと思っています。 質問文が分かりにくい場合は補足させていだきますのでご回答のほどよろしくお願いします。

  • JavaのTCPソケット通信プログラムについて

    初めてJavaでTCPソケット通信を書いてみたのですが、質問です。ソケット通信をサーバーとクライアント側で確立した後、メッセージの送受信をやるとても簡素なプログラムを作成しました。一回目の送受信をするだけだと上手くいくのですが、同じコネクション内で二回目の送受信をするよう追記したところ動作がおかしくなりました。(一つ目のメッセージも受信しないまま画面が停止した状態になる)何が問題なのでしょうか。 (Receiver.java) public class Receiver { public static final int PORT = 30000; public static void main(String[] args) { try { ServerSocket serverSoc = new ServerSocket(PORT); Socket socket = null; System.out.println("Waiting for Connection.."); socket = serverSoc.accept(); System.out.println("Connection from "+socket.getInetAddress()); // receive message BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("Message from sender ="+new String(br.readLine())); //send message←ここを追記するとおかしくなりました。 String message = "Hey This is receiver"; BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); System.out.println("I will send: "+message); bw.write(message); br.close(); bw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } (Sender.java) public class Sender { public static final int PORT = 30000; public static void main(String[] args) { try { InetAddress LocalHost = InetAddress.getLocalHost(); InetSocketAddress socketAddress = new InetSocketAddress(LocalHost, PORT); Socket socket = new Socket(); socket.connect(socketAddress, 10000); //send message String message = "Hey This is sender"; BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); System.out.println("I will send: "+message); bw.write(message); // receive message←同じくここを追記するとおかしくなりました。 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("Message from receiver ="+new String(br.readLine())); br.close(); bw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }

  • XMLHttpRequestがApacheのaccess_logに残らない

    XMLHttpRequestの通信がApacheのaccess_logに記載されません。 var req = new XMLHttpRequest(); req.open('GET', url); req.send(null); だけでテストしてもだめです。しかしXMLHttpRequesの返答はちゃんとできていてステータスコードも正常です。ログに入らないだけです。 これはなぜでしょう。XMLHttpRequestとはそういうものなのでしょうか。 もしそうなら、アクセス数でページビューをカウントする場合、XMLHttpRequestで閲覧した人はページビューにまったく反映されないという事になりますよね

  • XMLHttpRequestでキャッシュを使用させないようにしたい

    ある場所にonMouseoverで ツールチップのようにデータを XMLHttpRequestを使用して読み込み、表示しています。 読み込みは getPage('xxx.php?id=$id') というようにPHPを使用してDBを読み取り、 該当のIDの情報を読み出しているのですが、 この情報が編集されることがあります。 しかし、一回開いてしまうと、キャッシュが効いているのか、内容を編集しても編集後の内容を取ってくれません。 テストをした結果ブラウザを閉じるか、キャッシュを削除すれば又最新の情報を表示してくれるのですが、 読み込むごとに最新の情報にアクセスする(キャッシュを使用しない)方法はないでしょうか。 ブラウザはIEを使用しています。 よろしくお願いします。 以下ソース function getPage(pageURL) { document.charset='EUC-JP'; if(document.all){ rx = event.clientX + document.body.scrollLeft; ry = event.clientY + document.body.scrollTop; }else{ rx = NNX; ry = NNY; } xmlhttp = createXMLHttp(); if (xmlhttp) { xmlhttp.onreadystatechange = setPageData; xmlhttp.open('GET', pageURL,true); xmlhttp.send(null); }else{ alert("XMLHttpRequest失敗"); } } function setPageData() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { opentext( [xmlhttp.responseText] ,rx,ry); //↑表示用ルーチンに受け渡しているだけなので割愛 } } // XMLHttpsオブジェクト作成 function createXMLHttp() { try{ return new ActiveXObject ("Msxml2.XMLHTTP"); }catch(e){ try { return new ActiveXObject ("Microsoft.XMLHTTP"); }catch(e){ try { return new XMLHttpRequest(); }catch(e) { return null; } } } return null; }

  • ソケットにおけるメッセージの送受信について

    いつもお世話になっています。 ソケットに関して質問します。 下記の手順でソケットを使用したいと考えています。 クラスAとクラスBが存在する。 1)クラスA:ソケット通信でメッセージ送信 2)クラスB:ソケット通信によるメッセージを取得 3)クラスB:ソケット通信で返信する 4)クラスA:ソケットによるメッセージを再取得する このとき、クラスAがクラスBによるメッセージ再信が、30秒以内にこなければ、ソケットを閉じる それにあたってソースを1クラスで実行できるよう書き変えたいのですが、どうも上手くいきません。 実行したいメソッド手順が ソケットを開く openSocket ソケットにメッセージ送信 sendMsg ・・・1と3はこのメソッドを使用 メッセージ取得 getMsg ・・・2と4はこのメソッドを使用 ソケットを閉じる closeSocket の順です。 自分で一度考えてみたソースは以下です。 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; public class Messaneger{ private Socket socket; private BufferedReader in; // ソケットを開く public void openSocket() { ServerSocket serverSocket; try { serverSocket = new ServerSocket(5555); System.out.println("クライアントからの接続をポート5555で待ちます"); // クライアントからの接続を待ちます Socket socket = serverSocket.accept(); System.out.println(socket.getInetAddress() + "から接続を受付ました"); // 出力ストリームを取得 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 入力ストリームを取得 in = new BufferedReader( new InputStreamReader( socket.getInputStream())); } catch (IOException e) {} } //ソケットを閉じる public void closeSocket() { try { socket.close(); } catch (IOException e) {} } /** * ソケット通信でメッセージを送信 * @param 送信するメッセージ */ public void setMsg(String sendMsg) { try { socket = new Socket("localhost", 5555); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 入力ストリームを取得 in = new BufferedReader( new InputStreamReader( socket.getInputStream())); //サーバーにメッセージ送信 out.println( sendMsg ); //送信メッセージdata System.out.println(sendMsg); } catch (IOException e) {} } /** * ソケット通信でメッセージを取得 * @return msg サーバーに渡されたメッセージ */ public String getMsg() { String getMsg = ""; BufferedReader in; try { in = new BufferedReader( new InputStreamReader( socket.getInputStream())); System.out.println(in.readLine()); } catch (IOException e) {} return getMsg; } } 参考URL:http://www.hellohiro.com/socket.htm 宜しくお願いします。

  • XMLHttpRequestオブジェクトが思うように動作しない

    XMLHttpRequestオブジェクトが思うように動作しない 質問させてください。 JAVASCRIPTでRSSリーダーを作成しているのですが、うまく作れません。 処理は以下のように行っています。 1. RSSのURLを配列に格納する。 2. XMLHttpRequestオブジェクトを作成する。 3. 配列の要素数だけforループを行い、ループ内でopen処理とコールバック関数の設定を行う。 僕の行っている処理では、なぜか最後に登録したURLのRSSだけが表示されます。(push,popしているので最後に登録=最初にopenする) 参考までにコードを以下に記載します。 どうかお知恵をお貸しください。 //ファイルにアクセスし受信内容を確認します methodは'GET' function requestFile( data , method ) { URLList = new Array(); URLList.push(URL1); URLList.push(URL2); //XMLHttpRequestオブジェクト生成 httpoj = createHttpRequest() //[1] for (i = 0; i < URLList.length; i++) { //open メソッド // HTTP上のXMLでないと駄目・・・? URL = URLList.pop(); document.getElementById('test1').innerHTML += URL; httpoj.open( method , URL , 'false'); //[2] //受信時に起動するイベント httpoj.onreadystatechange = function() //[4] { //readyState値は4で受信完了 if (httpoj.readyState==4) //[5] { //コールバック on_loaded(httpoj); } } } //send メソッド httpoj.send( data ); //[3] }

専門家に質問してみよう