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

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

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

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

Socket.IO

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

WebSocket

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

5292閲覧

Node.jsのSocket.IOサーバーにWebSocketクライアントから接続する方法はないのか

FUGAMARU-MCPE

総合スコア33

Node.js

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

Socket.IO

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

WebSocket

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/03/06 12:44

Node.jsでSocket.IOを利用したサーバーを建てていて、そこにPHPのPawlというWebSocket接続ライブラリーを使用して接続しようと、早速簡単なコードを組んでみたのですが、「Connection closed before handshake」というエラーが返されました。
組んだコードは次のようになっています。

↓Node.js側↓

JavaScript

1~省略~ 2chat = io.sockets.on('connection', function(socket) { 3 socket.emit('connected'); 4 5 socket.on('roomin', function(req) { 6 socket.join(req.id); 7 var id = socket.id; 8 chat.to(id).emit('donejoin'); 9 }); 10 11 socket.on('send', function(req){ 12 chat.to(req.id).emit('get', { 'name': req.name, 'message': req.message }); 13 }); 14~省略~

↓PHP側↓

PHP

1<?php 2 3require __DIR__ . '/vendor/autoload.php'; 4 5$loop = React\EventLoop\Factory::create(); 6$connector = new Ratchet\Client\Connector($loop); 7 8$connector('ws://192.168.1.10:3000', ['protocol1', 'subprotocol2'], ['Origin' => 'http://192.168.1.10'])->then(function(Ratchet\Client\WebSocket $conn) { 9 $conn->on('message', function(\Ratchet\RFC6455\Messaging\MessageInterface $msg) use ($conn) { 10 echo "Received: {$msg}\n"; 11 $conn->close(); 12 }); 13 14 $conn->on('close', function($code = null, $reason = null) { 15 echo "Connection closed ({$code} - {$reason})\n"; 16 }); 17 $ary = array("id"=>"123456"); 18 $result = json_encode($ary); 19 $conn->send('roomin', $result); 20 21 $ary2 = array("name"=>"TEST", "message"=>"TESTMESSAGE"); 22 $result2 = json_encode($ary2); 23 $conn->send('send', $result2); 24 25}, function(\Exception $e) use ($loop) { 26 echo "Could not connect: {$e->getMessage()}\n"; 27 $loop->stop(); 28 }); 29 30$loop->run();

接続先のIPとイベントの所だけ書き換えました。

PHPでSocket.IO用のライブラリーを使うのが一番良いのはわかっているのですが、このようなライブラリーを使ってみてもクラスが見つからないというエラーが吐かれたまま解決できずに結構日が立ってしまったので諦めてしまいました...

PHP

1require_once __DIR__ . '/vendor/autoload.php'; 2use PHPSocketIO\SocketIO; 3use Workerman\Worker;

と記述するとSocketIOというクラスが見つからないというエラーです。
実行するphpファイルがあるディレクトリーにPHPSocketIOというフォルダーが合って更にその中にSocket.IOというクラスのSocket.IO.phpというファイルが配置されているのですが...

よろしければ、「Node.jsのSocket.IOサーバーにWebSocketクライアントから接続する方法」、もしくは先程のライブラリーのクラスエラーを無くす方法がありましたら、ご回答よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Socket.IOはWebSocketが使用できない環境においては、xhr polling等の代替え手段にフォールバックする機能を持っており、また、まずはxhrで接続を行いWebSocketが使用できる場合はWebSocketに切り替えるという戦略をとっています。
またメッセージにおいても独自のメッセージフォーマットを使用してメッセージのやり取りを行います。
これにより、素のWebSocketをベースとしたライブラリを使って接続することはできません。

あと、phpsocket.ioはSocket.IOの代替えで、サーバー側の実装であり、クライアントではないためこれを用いて接続することはできません。

ですので、node.js側はSocket.IOを使用するのではなくwsを使用すれば素のWebSocketベースサーバーとなりますのでPawlで接続できます。

投稿2017/03/07 11:18

turbgraphics200

総合スコア4267

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

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

FUGAMARU-MCPE

2017/03/07 11:38

WebSocketでルーム機能を実装するにはどのような仕組みを作ればいいですかね... Socket.IOだとjoin機能があったので簡単だったのですが。
turbgraphics200

2017/03/07 11:44

実装はそう難しくないと思いますが。ルーム名を第一keyに、ユーザーIDを第二keyに、WebSocketセッション(Client)をvalueにした多段連想配列を生成すればいいと思いますが。
turbgraphics200

2017/03/07 13:15

レスは受け取れないようですね。
FUGAMARU-MCPE

2017/03/08 13:43

話が戻りますが、WebSocketで特定のルームにメッセージを送信する場合はどのようにすれば良いのでしょうか?
guest

0

PHPSocketIOのインストールは、Composer経由で行いましたでしょうか。

オートロードを正しく構築するためには、手動でファイルを入れるのではなく、Composerを使う必要があります。

投稿2017/03/06 22:01

maisumakun

総合スコア145183

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

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

FUGAMARU-MCPE

2017/03/07 09:20

その存在にこの質問をしたあと気づきました。 composerのコマンドを使ってインストールしたのですが、 「PHP Fatal error: Call to undefined function Workerman\Lib\pcntl_signal() in C:\Users\FUGAMARU\Desktop\SocketIOClient\vendor\workerman\workerman\Lib\Timer.php on line 57」というエラーが吐かれるようになりました。 57行目は「pcntl_signal(SIGALRM, array('\Workerman\Lib\Timer', 'signalHandle'), false);」と記述されています。
FUGAMARU-MCPE

2017/03/07 11:36

ありがとうございます。調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問