socket.ioを備えたnodejs
-
27-10-2019 - |
質問
socket.io Homepage(http://socket.io/)の例を使用しています。それは機能し、すべてですが、時間データが送信されるまでの間に大きな遅延があり、そのデータが反対側で受信されたときに大きな遅延があります。
私はXAMPPを使用しており、dirにsocket.htmlがあり、ブラウザで「http://localhost/socket.html」を使用してナビゲートします。ポート8080でサーバーを聞いています。
サーバ:
var io = require('socket.io').listen(8080);
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
HTMLファイル:
<html>
<head>
<script src="http://localhost:8080/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost:8080');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
</head>
<body>
</body>
</html>
解決
私は問題を見つけました。
サーバーで私は変更しました:
var io = require('socket.io').listen(8080);
に
var io = require('socket.io', { rememberTransport: false, transports: ['WebSocket', 'Flash Socket', 'AJAX long-polling'] }).listen(8080);
これにより、サーバーは、WebSocket、Flash Socket、またはLongpollingのいずれかを使用します。それらをその順序で使用しようとします。 Remember Transportは、サーバーとクライアントに最後に使用した接続を忘れさせ、上記の「トランスポート」に接続しようとします。
クライアント側では、私はほぼ同じことをしました。追加した:
{ rememberTransport: false, transports: ['WebSocket', 'Flash Socket', 'AJAX long-polling']}
ソケットコンストラクターに。だから、それは次のように見えました:
var socket = io.connect('http://localhost:843', { rememberTransport: false, transports: ['WebSocket', 'Flash Socket', 'AJAX long-polling']});
今では完全に機能しているようです。
みんなありがとう。
他のヒント
長いメッセージで試しましたか?
ソケットには確かにバッファがあります。 X未満のバイトを送信すると、バッファが満たされていないため、バッファがフラッシュされるまでの待ち時間があるかもしれません。
どのブラウザを使用していますか? Socket.ioはポーリングに分解します。これは、ネイティブブラウザのWebソケットやフラッシュポーリングよりもはるかに遅くなります。
WebSocketを使用すると、バッファリングを無効にするという意味で動作が向上します。 WebSocketsはで実装されています setNoDelay(true)
で見ることができるように WebSocketsコード したがって、メッセージはメッセージをバッファリングしません。
単語を配置して、WebSocketsを明示的にリクエストできます websocket
最初に transports
配列。の最近のバージョンについて socket.io
と engine.io
正しい議論と実装は次のようになります:
import socketIO from 'socket.io';
const server = express();
const requestHandler = server.listen(PORT, () => console.log(`Listening on ${PORT}`));
const io = socketIO(requestHandler, { transports: ['websocket', 'polling'] });
そしてクライアント側で:
import io from 'socket.io-client';
let socket = io(SERVER_URL, { transports: ['websocket', 'polling'] });