[解決済み】WebSocket接続に失敗しました。WebSocket のハンドシェイク中にエラーが発生しました。予期しない応答コードです。400
質問
Socket.ioをAngularと統合しようとしていますが、クライアントサイドからサーバーへの接続に問題があります。私は他の関連する質問に目を通しましたが、私の問題はローカルで起こっているので、真ん中にウェブサーバーはありません。
私のサーバーコードはこんな感じです。
const app = express();
const server = http.createServer(app);
const io = require('socket.io').listen(server);
io.on('connection', function(socket) {
socket.emit('greet', { hello: 'Hey, Mr.Client!' });
socket.on('respond', function(data) {
console.log(data);
});
socket.on('disconnect', function() {
console.log('Socket disconnected');
});
});
クライアント側のJavaScriptファイルをGruntを使って以下の順番で読み込んでいます。
dist: {
src: [
public/bower_components/angular/angular.min.js,
...
public/bower_components/socket.io-client/dist/socket.io.min.js,
public/bower_components/angular-socket-io/socket.min.js,
...
]
}
そして、私のコントローラーで
function MyController($scope) {
let socket = io.connect(window.location.href);
socket.connect('http://localhost:3000');
socket.on('greet', function(data) {
console.log(data);
socket.emit('respond', { message: 'Hello to you too, Mr.Server!' });
});
...
}
実際に使用する前に
btford/angular-socket-io
ライブラリで、正しく接続できることを確認したいのですが、コンソールに次のようなエラーが表示されます。
面白いのは、Node.jsのサーバープロセスを再起動すると、websocketの代わりにポーリングを使ってメッセージを送信することができることです。
socket.connectの呼び出しでいろいろなオプションを試したのですが、何もうまくいきませんでした。
何かお手伝いいただけると幸いです。
を更新しました(2016/12/30)。
今気づいたのですが、websocketsは部分的に動作しています。Chromeのデベロッパーコンソールで101 Switching Protocolsのリクエストが表示されるんです。しかし、私がそこに見る唯一のフレームは、engine.ioプロトコルのパケット(ping、pong)です。しかし、私のアプリケーションソケットメッセージは、なぜかまだポーリングにフォールバックします。
解決方法は?
問題解決 この問題を解決する方法はわかりましたが、これが正常な動作なのかどうか、まだ知りたいです。
Websocket 接続が正しく確立されても (101 Switching Protocols リクエストで示される)、デフォルトで long-polling になっているようです。この修正は、Socket.io の接続関数にこのオプションを追加することで簡単に行うことができました。
{transports: ['websocket']}
それで、最終的にこのようなコードになりました。
const app = express();
const server = http.createServer(app);
var io = require('socket.io')(server);
io.on('connection', function(socket) {
console.log('connected socket!');
socket.on('greet', function(data) {
console.log(data);
socket.emit('respond', { hello: 'Hey, Mr.Client!' });
});
socket.on('disconnect', function() {
console.log('Socket disconnected');
});
});
で、クライアントでは
var socket = io('ws://localhost:3000', {transports: ['websocket']});
socket.on('connect', function () {
console.log('connected!');
socket.emit('greet', { message: 'Hello Mr.Server!' });
});
socket.on('respond', function (data) {
console.log(data);
});
そして、メッセージはフレームとして表示されるようになりました。
この Githubイシュー が正しい方向を指し示してくれました。助けてくれた皆さん、ありがとうございました
関連
-
[解決済み】document.getElementByIDは関数ではありません。
-
[解決済み】フォームコントロールの値アクセサがない
-
[解決済み] Uncaught Invariant Violation: 前のレンダリング中よりも多くのフックをレンダリングした
-
[解決済み] 解決済み】clearInterval()が動作しない [重複] [重複]
-
[解決済み】Google Conversionsが動作しない - スクリプトが読み込まれない
-
[解決済み] テスト
-
[解決済み】Node.jsのエラーECONNRESETをデバッグするにはどうすればよいですか?
-
[解決済み】FirefoxでGoogle Maps V3をリモートで使用すると「googleが定義されていません」と表示される。
-
[解決済み】HTMLの最初の行に予期しないトークン<がある。
-
[解決済み] Uncaught (in promise) TypeError: フェッチに失敗してCorsエラー
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】node.js TypeError: path must be absolute or specify root to res.sendFile [JSONのパースに失敗しました]。
-
[解決済み】Failed to load resource: net::ERR_FILE_NOT_FOUND loading json.js
-
[解決済み】SecurityError: オリジンを持つフレームがクロスオリジンフレームにアクセスするのをブロックした
-
[解決済み】JavaScriptのボタンonclickが機能しない
-
[解決済み】npm install --legacy-peer-deps は具体的に何をするのですか?どんなときに推奨されるのか/どんな使用例が考えられるのか?
-
[解決済み】JS ファイルが net::ERR_ABORTED 404 (Not Found) を取得する)
-
[解決済み】WebSocket接続に失敗しました。WebSocket のハンドシェイク中にエラーが発生しました。予期しない応答コードです。400
-
[解決済み】Uncaught ReferenceError。Firebase は定義されていません。
-
[解決済み】Syntax error: JavaScriptの不正なreturnステートメント
-
[解決済み】JavaScriptで関数が存在するかどうかを確認する方法は?