Node JS socket.on () глюк на стороне клиента? - PullRequest
0 голосов
/ 21 января 2020

Я учусь Node JS и столкнулся с каким-то странным поведением, на которое, возможно, кто-то знает ответ. Многие посты с учебниками, с которыми я сталкивался, говорят о том, что на стороне клиента для отправки запроса на сервер используется "socket.on ('connect', function () {blah blah})". По сути, это должно остановить вызов от отправки на сервер до тех пор, пока сервер не установит соединение с клиентом, однако, когда я тестирую код, он работает до тех пор, пока сначала запускается клиент html, а затем запускается node js. Если node js сначала запускает серверный код, а затем запускается клиентская сторона html, по какой-то причине функция emit не обращается к серверу. Если я опускаю функцию socket.on и go прямо к моему Функция socket.emit, сервер получает функцию emit от клиента. Если node js не выполняется первым, клиентская сторона html продолжает работать до тех пор, пока node js не запустит серверный скрипт, после чего клиент подключится, и отправляет запрос автоматически. Кто-нибудь знает, почему это происходит? Как я уже сказал, я все еще изучаю сокеты и Node JS, поэтому я бы Я понимаю, что такое поведение, а не просто продолжаю писать код, хотя я заставил его работать. Любая предоставленная вами информация будет чрезвычайно ценной. Спасибо. :)

// Server side

var express = require('express');
var socket = require('socket.io');
var app = express();
var server = app.listen(1111, function(){ console.log("Server Listening"); });
var io = socket(server);

io.on('connect', function(socket) {

	socket.on('Contact', function(data) {

		socket.join(data);
		console.log(data); // just to test if data is sent
		
	});

});
// Client in head section

<script src = "https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.js"></script>
<script type = "text/javascript">
var socket = io.connect("http://localhost:1111");

function Setup() { // called when page has loaded

  //blah blah blah lots and lots of code
  
  var data = "blahblah"; // room to join
  
  socket.on('connect', function(){
  
    socket.emit('Contact', data);
   });
}
   
 // If I remove the socket.on function it works flawlessly everytime.  Left in, it will only fire if the
 // node js server file is launched after the client launches

1 Ответ

1 голос
/ 21 января 2020

Кажется, вы вызываете функцию Setup() вручную через некоторое время (возможно, в событии загрузки страницы, основываясь на комментарии). Это означает, что вы создаете условие гонки: если сервер подключается до события загрузки страницы, событие подключения происходит слишком быстро, и вы подключаете слушателя только после того, как это произойдет.

По сути, это происходит так:

Первый случай (сервер запускается после клиента)

  • Клиент HTML загружается, сценарий выполняется
  • Клиент начинает попытки подключения к серверу
  • Ресурсы клиента fini sh загрузка, Setup() называется
  • Клиент connect прослушиватель подключен к сокету
  • Сервер запускается, начинает принимать подключения
  • Сервер принимает подключение клиента
  • Клиент connect Слушатель запускает, отправляет событие Contact

Второй случай (клиент запускается после сервера)

  • Сервер запускается, начинает принимать подключения
  • Клиент HTML загружается, сценарий выполняется
  • Сервер принимает подключение клиента
  • В настоящее время нет connect прослушивателя, поэтому ничего не происходит
  • Активы клиента fini sh loading, Setup() вызывается
  • Client connect слушатель подключен к сокету
  • Silence ...

Чтобы исправить, вы должны только звоните io.connect(...) в той же области, в которую вы добавляете слушателей. Это означает либо перемещение socket.on('connect', ...) за пределы Setup (), либо перемещение io.connect() внутри Setup () (возможно, лучше).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...