• 締切済み

websocket 双方向通信

こんにちは、 現在ブラウザハックという本で学習しているのですが、 いまいちwebsocketを使った双方向通信という方法を使った 方法が解りません。 firefoxでrequestを送って動作を学習しようと思うのですが どういう風にやったら良いでしょうか? ご教示お願いします。 ホストOS:windows10 ゲストOS:kalilinux

みんなの回答

回答No.6

このエラー複数の原因があったはずで、 これだ!と絞れない感じだったはずですが。 https://gendosu.jp/archives/1171 これも原因としてはありえるし。ほかもあるのですが。 そのPHPではなく、普通にHTMLのファイルだとして、 80でも443でも正しく送り出せていますか? 私の方では、そのサンプルを80でも443でも 正常に動作しており、直接関係がないように思えます。 なお、httpdにmod_sslを入れた直後は、 私も妙なエラーと毎回戦ってる気はしますが。 (鶏が先か卵が先か問題を毎回やってますね) ひとまず、今回のサンプルは関係がない所での エラーだと思いますよ。それ。

voltage999
質問者

お礼

回答ありがとうございます。 htmlだと問題なく開けました。

voltage999
質問者

補足

Documentrootのファイルが今調べたら入ってませんでした。 httpd.confもなければ/var/www/htmlにも入ってなかったです。 httpd -Vでも見つからないです。 とりあえずhttpd.confとそのファイルの内容を改めて作りたいのですが。

回答No.5

SSL received a record that exceeded the maximum permissible ↑これ、HTTPSでしかでないはず。 なぜ、443ポートを使ってるのでしょう? ポートは80ポートでまず試すことをお勧めします。 当然アドレスもHTTPで始まる。 このサンプルそのものは、SSLに依存してないので、 どちらでも動作しますよ。 という事でまず、サーバーの設定の確認をお願いしたく。

voltage999
質問者

お礼

いえ、httpポートでもhttpsでも出てきてしまいます。 index.php server.phpどちらもポートの設定で80番にしました。 それでアクセスした所、そのような状態になってしまいます。

voltage999
質問者

補足

書く場所なかったので、こっちに最新補足書きます。 └─$ php -q server.php PHP Notice: Undefined index: Sec-WebSocket-Key in /var/www/html/server.php on line 140 PHP Warning: socket_getpeername(): unable to retrieve peer name [107]: Transport endpoint is not connected in /var/www/html/server.php on line 35 PHP Warning: socket_getpeername(): unable to retrieve peer name [107]: Transport endpoint is not connected in /var/www/html/server.php on line 66 PHP Notice: Undefined index: Sec-WebSocket-Key in /var/www/html/server.php on line 140 PHP Notice: Undefined index: Sec-WebSocket-Key in /var/www/html/server.php on line 140 PHP Notice: Undefined index: Sec-WebSocket-Key in /var/www/html/server.php on line 140 PHP Warning: socket_getpeername(): unable to retrieve peer name [107]: Transport endpoint is not connected in /var/www/html/server.php on line 35 PHP Warning: socket_getpeername(): unable to retrieve peer name [107]: Transport endpoint is not connected in /var/www/html/server.php on line 66 ^[[A^Z zsh: suspended php -q server.php

回答No.4

あ、、、 localhost:9000/etc/php/7.4/apache2/index.php これですね。原因 /index.phpは、普通のWEBリクエストなので、ポート80です。 localhost/etc/php/7.4/apache2/index.php というか、etcの中にDocumentRootおいたんですか^^? つうじょうなhost:9000/etc/php/7.4/apache2/index.php これですね。原因 /index.phpは、普通のWEBリクエストなので、ポート80です。 localhost/etc/php/7.4/apache2/index.php というか、etcの中にDocumentRootおいたんですか^^? デフォルトは、/var/wwwなどだったと思いますが^^ (それ自体は問題はないですが) それで、落ちてきたHTML (むしろJavaScriptが、localhost:9000でWSを開くのであって、初期リクエストは80ですね) HTTP=80 HTTPS=443(今回は使っていないでしょうけど)

voltage999
質問者

お礼

遅くなりました、申し訳ありません。 SSL received a record that exceeded the maximum permissible このようなエラーが出てきてしまい ページを再現することができません。 かなり遅くなりましたが、良ければご教示お願いします。

回答No.3

>真っ白な状態になってしまいます。 まず、そのポートは開いてますか? Firewallなどを確認。 別の方法は、HTTPDにProxyを設定して、 特定のURLをローカルの9000に転送してしまうというやり方もあります。 まず、サーバーがいる状態でリクエストした時と、 立ち上げている時リクエストした時で、ブラウザの挙動が 違いますか?(同じならほぼFirewallが原因、いてもいなくても同じ結果) 後は、ソース内に、あちこちにechoなどを置いて。 サーバー側で、どこをどう通過した?がわかるようにしておくと、 コンソールにダラダラとメッセージがでて、わかりやすいです。 なお、PHP側のソースのURLっぽい所は使われてないので、 そこどうでもいいです。(ソケットなので、URLは要らないので)

voltage999
質問者

お礼

回答ありがとうございます。 何回かやっているうちにlinuxのシステムが壊れたみたいで、 もう一度再インストールせざるを得なくなりました。 あとhttpdのプロキシの転送はよく解らないのですが、 相変わらずnot fountと出ますね。 エラーうろ覚えですが、Permission の Resourceとか書いてあった気がします。 すみません、また明日仕事が終わって手が付けられたら します。

voltage999
質問者

補足

今何とかシステム復帰させたら、 それから検証したら 500 Internal Errorとブラウザ画面に出ていますね。 Config error -couldn't chdir().

回答No.2

えっと、Linuxのコンソールでやってみてもらえます? >ホストOS:windows10 >ゲストOS:kalilinux Windowsってホストになるには面倒が多く、 解決が簡単なことを、よりややこしくしていくだけなんですよ。 また、このサンプルの場合は、 HTML上のJSを落としてから、そのJSがWSへの接続を 行っており、単純にWSのみを提供するよりは、 面倒になっています。 (ただし、WSのクライアントを1から書くのはもっと面倒ですが) という感じで、まずは、動く環境を作るのを最優先にして、 XAMPPなどの環境は、いったん後でやるほうがいいと思います。 (おそらくXAMPPでも動きますが、PHPで簡易デーモン化状態を  を作るのが面倒になると思います。BashがないですからXAMPPは)

voltage999
質問者

お礼

回答ありがとうございます。 Linuxコンソールでserver.phpを起動後 localhost:9000/etc/php/7.4/apache2/index.php を開いたのですが真っ白な状態になってしまいます。 原因が解りません。 ご教示お願いします。

回答No.1

いい質問です。 超お勧めの記事があります。 https://susan-style.hatenablog.com/entry/20140306/1394103655 それと「双方向」という考え方は持たなくていいかと。 Socketは基本的に常に双方向です。 あるパケットを相手に送り出したら、相手が受け取ったと 送り返さないと、また送られますから、短方向では 相手からの受信確認が受け取れませんから。 むしろ、リアルタイム的なニュアンスの方が、 いい結果を生むと思いますよ。 今回書いたサンプルのアドレスですが、 こちらで、確実に動作したことを確認している物です。 ただし、バグも同時に理解しましたが。 ただバグと言っても、学習する程度には、 何ら影響はないので、かなり勉強になるものですよ。 このサンプル、 ABNFのあたりRFC5234が、いい加減に作られているのですが、 確かに動作するので、これでどうでしょうか? このサンプルやWebSocket(WSもWSSも動作確認済み、Proxy経由でのWebSocketも動作確認できています。)などご協力できる 事は多いかもしれません。 という事でまず回答ですが、 恐らくすでに入っているとは思いますが。 このサンプルで動作確認を取るのであれば、まずは PHPが入っている事を確認してください。 たったそれだけで、動いちゃいますので。 後は、ブラウザを2個開いて、 同じアドレスを指定して、 1個目に文字を書くと、2個目のウインドウに出る。 2個目に文字を書くと、1個目のウインドウに出る。 これらが同時に行われていれば、テストは成功です。

voltage999
質問者

お礼

なるほど!回答ありがとうございます。 早速やってみようと思います。 見たところ非常に解りやすい感じです。

voltage999
質問者

補足

すみません、phpのサーバーの起動にてこずっています。 XAMPPを使っているのですが、なぜかXAMPPの管理マネージャーみたいなものでやっても設定ができないです。 (サーバーが落ちてる感じで) 因みにnotfoundでしたがそのページ自体は開けた感じです。

関連するQ&A