WebSocketを使用したクライアントモジュールを開発する必要が出てきたので、WebSocketがどんなものかを体験するということで、下記のサイトを参考にWebSocketを試せる環境を作りました。
PHPのみでHTML5のWebSocketを体験する方法 – [Swb:]渋谷に住むWEBデザイナの備忘録
この記事のとおりにファイルをダウンロードしてサーバにアップロードすることで、WebSocketを使ったチャットルームが簡単に動作しました。ありがとうございました。
さて次のステップに進むためにクライアント側を自分で作成してみたのですが、どういうわけかサーバに接続できません。サーバで動いているPHPスクリプトからエラーが出力されています。※ダウンロードした状態では @socket_read() という感じに警告表示が抑止されているので @ を削除すると表示されます。
最初のエラー

PHP Warning: socket_read(): unable to read from socket [104]: Connection reset by peer

次のエラー

PHP Warning: socket_getpeername(): unable to retrieve peer name [107]: Transport endpoint is not connected

ダウンロードした client.php では問題なく接続できるので、自分で作成したクライアントモジュールに問題があるのかもしれませんが、どんなに調べても原因がわかりません。
クライアント側のエラー

Handshake Error: Invalid Accept Key

WebSocketで接続したときに行われるハンドシェイクで問題が起きているようです。とは言ってもよくわからないので、やりとりされる内容をパケットキャプチャで調べてみることにしました。すると。。。
サイトからダウンロードした server.php がハンドシェイクするときに Sec-WebSocket-Accept を返すのですが、その行の区切り文字のコロンの後ろに半角スペースが入っていないために、クライアント側で取り込めていないことがわかりました。

修正前: “Sec-WebSocket-Accept:$secAccept\r\n\r\n”;
修正後: “Sec-WebSocket-Accept: $secAccept\r\n\r\n”;

違いがわかりにくいかもしれませんが、$secAccept の前に半角スペースを追加しています。
これで無事WebSocketの通信が行えるようになりました。
ちなみにチャットルームのサンプルプログラムのダウンロード元は
http://www.sanwebe.com/downloads/50-websocket-example
です。

カテゴリー: サーバ関連

0件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください