我正在使用Socket IO,客户端和服务器之间的连接已成功建立。我面临两个问题:
1-在客户端和服务器之间建立初始连接时,服务器上的socket.client.id
和客户端上的socket.id
都是相同的,但是当我刷新客户端页面时,客户端的ID更改为另一个,但在服务器上仍然相同。与服务器或什至使用套接字与客户端通信时,如果没有相同的ID,是否会引起任何问题?或刷新客户端页面时服务器上的ID是否更改?
2-在初始连接建立时,套接字使用来自服务器的socket.emit()
传递消息,并在客户端上作为socket.on()
接收消息。但是当我尝试从客户端发出任何内容时,服务器上都不会收到它。
套接字连接
function Globals() {
this.socketConnection = async function() {
let p = new Promise(function(res, rej) {
io.on("connection", function(socket) {
if (socket.connected) {
res(socket);
} else {
rej("Socket Connection Error !");
}
})
})
return await p;
}
}
new Globals().socketConnection().then(function(soc) {
console.log(soc.client.id);
socket = soc;
soc.emit("Hi");
soc.on("Nady", function() {
console.log("I am called");
})
})
客户端连接
function Globals() {
this.socketConnection = async function() {
var socket = io('http://localhost:8080');
let p = new Promise(function(res, rej) {
socket.on('connect', function() {
if (socket.connected) {
console.log(socket.id);
res(socket);
}
})
})
return await p;
}
}
var socket;
new App().socketConnection().then(function(s) {
socket = s;
});
function ScrapJobs() {
var socket;
new App().socketConnection().then(function(s) {
socket = s;
});
var _this = this;
this.attachListeners = function() {
qs("#init-scrap").ev("click", _this.startScrapping);
}
this.startScrapping = function() {
console.log("I am cliced");
socket.on("Hi", function() {
console.log("Hi Nadeem");
})
socket.emit("Nady");
}
}
答案 0 :(得分:1)
在客户端和服务器之间建立初始连接时,服务器上的socket.client.id和客户端上的socket.id都相同,但是当我刷新客户端页面时,客户端的ID更改为另一个,但在服务器上仍然相同。它有什么问题吗
在收到socket.id
事件之后,在客户端套接字对象上设置客户端connect
值,并在reconnect
事件之后对其进行更新(例如修改)。
看来,socket.io基础结构将使它们在客户端和服务器上保持相同。如果客户端断开连接,然后重新连接,则客户端和服务器上都会有一个具有新ID的新连接。客户端断开连接后,您可能尝试挂接到服务器上的旧套接字对象(我们真的看不到足够的服务器代码来评估它)。
在初始连接建立时,套接字使用来自服务器的socket.emit()传递消息,并在客户端上作为socket.on()接收。但是当我尝试从客户端发出任何内容时,服务器上都不会收到它。
您必须向我们展示可复制的案例。如果正确编写代码,则不会发生这种情况。我猜您在正确的套接字上没有正确的消息侦听器,才能查看正在发送的消息。我向您保证,正确实施后,从客户端向服务器发送消息就可以正常工作。
关于您的代码的一般注释。您显示的两个代码块似乎都是将socket
对象填充到范围更大(甚至是全局)的变量中。这可能是造成问题的部分原因,因为如果客户端出于任何原因重新连接,则该套接字对象可能会失效。加上将任何类型的套接字对象放入全局或模块级别的变量中,都使您的服务器仅能够服务一个客户端-这根本不是设计多客户端服务器的方式。