gpt4 book ai didi

node.js - Socket.io已连接但无法通信

转载 作者:行者123 更新时间:2023-12-03 12:05:10 25 4
gpt4 key购买 nike

我在安装了socket.io的节点服务器中有一个非常简单的配置(稍微复杂一点,但本质上是这样的):

var main = require('express')();
server = require('http').createServer(main);
io = require('socket.io')(server);

io.use(function(socket, next) {
console.log("middleware!");
next();
});

io.on('connection', function (socket) {
console.log('connected...');

socket.on('pong', function (data) {
console.log(data.message);
});

setTimeout(function() {
console.log("Saying hello");
socket.emit('ping', { message: 'Hello from server ' + Date.now() });

}, 1000);

});

server.listen(2080, function onCreateServerMain() {
console.log('Server main is listening on port 2080';
console.log('************************************************************');
});

在客户端中:
var socketIoScript,
loadSocketTimeout,
trialsToLoadSocketIo = 0,
APP_CFG = {baseUrl : "http://192.168.1.13:2080"};

function loadSocketIo(socketIoIp) {
socketIoScript = document.createElement('script');
socketIoScript.setAttribute('src', socketIoIp);
socketIoScript.setAttribute('onload', 'onSocketLoaded();');
document.head.appendChild(socketIoScript);
}

window.onSocketLoaded = function onSocketLoaded() {
if (typeof(io.connect) === 'function') {
var mSocket,
mIoSocket;

$timeout.cancel(loadSocketTimeout);
mIoSocket = new io.Manager(APP_CFG.baseUrl);

mIoSocket.connect(function(socket) {
console.log('Connected!!');
});
mIoSocket.on('error', function onSocketError(e) {
console.log('WebSocket Error ' + error);
});

mIoSocket.on('ping', function onPingReceived(e) {
console.log('Server emitted ping: ' + e.data);
mSocket.emit('pong', 'hi server!');
});
}
}

~(function onLoadSocketTimeout() {
var nextTimeout;

if (trialsToLoadSocketIo < 10) {
nextTimeout = 5000;
} else if (trialsToLoadSocketIo > 60) {
nextTimeout = 60000;
} else {
nextTimeout = 1000 * trialsToLoadSocketIo;
}

if (socketIoScript) {
document.head.removeChild(socketIoScript);
}

loadSocketIo(APP_CFG.baseUrl + '/socket.io/socket.io.js#' + trialsToLoadSocketIo);
loadSocketTimeout = $timeout(onLoadSocketTimeout, nextTimeout);
trialsToLoadSocketIo += 1;
})();

(我这样做是因为它是移动应用程序,因此可能没有连接)。我正在使用Brackets和Chrome进行测试。服务器和客户端在同一台计算机上。在应用程序中,脚本可以很好地加载,并且可以连接到服务器,正如我在节点日志中看到的那样(编辑:这是我在节点控制台中获得的所有信息):
Server main is listening on port 2080
************************************************************
middleware!
connected...
Saying hello

编辑:在Chrome控制台中,我没有收到任何消息,并且任何断点都在 on监听器处停止。如果我停止节点,Chrome的控制台将立即开始记录已断开连接:
GET http://192.168.1.13:2080/socket.io/?EIO=3&transport=polling&t=1413066902601-6 net::ERR_CONNECTION_REFUSED 
GET http://192.168.1.13:2080/socket.io/?EIO=3&transport=polling&t=1413066906606-7 net::ERR_CONNECTION_REFUSED

但是我看不到任何传入消息。在应用程序中,我没有收到任何传入消息。有什么原因即使成功连接套接字也无法在这种环境下通信?

编辑

没有应用程式正在接收对方发送的事件。来自节点的日志显示了这一点,来自Chrome的日志为空。

编辑

在Chrome应用中,我没有收到 console.log("Connected!");。但是我都没有收到 ERR_CONNECTION_REFUSED错误:我什么也没收到。

编辑

我设法通过更改Manager选项在应用程序中获取 console.log("Connected!");:
  mIoSocket = new io.Manager(APP_CFG.baseUrl, { autoConnect: false });

由于它是自动连接,并且在建立连接后附加了事件,所以从未达到“已连接”。但是我仍然没有在任何应用程序中收到任何事件。

最佳答案

好的,几件事:

首先,var mSocket似乎没有初始化,因此它可能很难发出()任何东西(我错过了什么吗?)

其次,当您执行以下操作时:

socket.on('pong', function (data) {
console.log(data.message);
});

服务器希望接收到一个包含 message属性的对象,例如: data = {message:'hi server'}在您的情况下,您发送一个字符串,因此 data'Hi server !',并且您的日志将显示“undefined”。您应该将此位更改为:
socket.on('pong', function (data) {
console.log(data);
});

如果您遇到类似的问题,则发送一个对象: { message: 'Hello from server ' + Date.now() },并尝试记录一个不存在的 data属性。将此位更改为:
  console.log('Server emitted ping: ' + e.message);

第三,您必须监听套接字上的事件,而不是'manager'

客户:
mIoSocket.connect(function(socket) {
console.log('Connected!!');
socket.emit('pong');

socket.on('error', function onSocketError(e) {
console.log('WebSocket Error ' + error);
});

socket.on('ping', function onPingReceived(e) {
console.log('Server emitted ping: ' + e.data);
socket.emit('pong', 'hi server!');
});
});

服务器:
io.on('connection', function (socket) {
console.log('connected...');

socket.on('pong', function (data) {
console.log(data);
});

setTimeout(function() {
console.log("Saying hello");
socket.emit('ping', { message: 'Hello from server ' + Date.now() });

}, 1000);

});

关于node.js - Socket.io已连接但无法通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26319931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com