簡體   English   中英

具有Socket.IO延遲發射數據的NodeJS

[英]NodeJS with Socket.IO delay emitting data

我正在使用Socket.IO主頁(http://socket.io/)中的示例。 它可以工作,但是在發送數據和在另一端接收數據之間存在很大的延遲。

我正在使用XAMPP,我在我的目錄中有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);

這會強制服務器使用WebSockets,Flash套接字或長輪詢。 它會嘗試按順序使用它們。 rememberTransport強制服務器和客戶端忘記它最后使用的連接,並嘗試連接上面的“傳輸”。

在客戶端,我幾乎做了同樣的事情。 我補充說:

{ rememberTransport: false, transports: ['WebSocket', 'Flash Socket', 'AJAX long-polling']}

到socket構造函數。 所以它看起來像:

var socket = io.connect('http://localhost:843', { rememberTransport: false, transports: ['WebSocket', 'Flash Socket', 'AJAX long-polling']});

現在看起來效果很好。

多謝你們。

你試過更長的消息嗎?

套接字肯定有緩沖區。 如果發送少於X個字節,則在刷新緩沖區之前可能會有一些等待時間,因為它沒有被填充。

使用websockets改進了行為,因為它禁用了緩沖。 Websockets是使用setNoDelay(true)實現的,如websockets代碼中所示,因此它不會緩沖消息。

您可以通過將websocket首先放在transports數組中來明確請求websockets。 在最新版本的socket.ioengine.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'] });

你使用的是什么瀏覽器? Socket.IO降級為輪詢,這將比本機瀏覽器Web套接字或閃存輪詢慢得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM