Jquery Socket.io ID问题,ID错误
让我们先说我不是程序员,我两天前才学会了nodeJS、Jquery、AJAX和Socket.IO。就像在一次聚会上一样,我对他们一无所知 我正在尝试创建一个类似jackbox的系统,并尽可能创建房间和添加玩家。但是socket.id出了问题,它总是为我添加的每个玩家返回相同的id。这是遇到问题的代码(注意:房间创建由unity调用,它似乎工作得很好,因为房间代码和id的存储方式与应该的完全相同): 我很确定,我可能在做一些不被允许的事情。我认为这可能与试图从io.on(‘连接’)中运行app.post有关,如果是这种情况,我对如何解决它有点迷茫。我需要存储在阵列中的玩家的socket.id,以便以后可以使用这些id发送重要的游戏数据 我的控制台日志(注意,在此日志中,所有ID都是相同的,但情况并非总是如此): 为了完成论者的利益,我将补充其他方面: app.js: rooms.ejsJquery Socket.io ID问题,ID错误,jquery,node.js,ajax,express,socket.io,Jquery,Node.js,Ajax,Express,Socket.io,让我们先说我不是程序员,我两天前才学会了nodeJS、Jquery、AJAX和Socket.IO。就像在一次聚会上一样,我对他们一无所知 我正在尝试创建一个类似jackbox的系统,并尽可能创建房间和添加玩家。但是socket.id出了问题,它总是为我添加的每个玩家返回相同的id。这是遇到问题的代码(注意:房间创建由unity调用,它似乎工作得很好,因为房间代码和id的存储方式与应该的完全相同): 我很确定,我可能在做一些不被允许的事情。我认为这可能与试图从io.on(‘连接’)中运行app.p
<!DOCTYPE html>
<html>
<head>
<title>Todo List</title>
<script
src="https://code.jquery.com/jquery-3.5.0.min.js"
integrity="sha256-xNzN2a4ltkB44Mc/Jz3pT4iU1cmeR0FkXs4pru/JxaQ="
crossorigin="anonymous"></script>
<link href="/assets/styles.css" rel="stylesheet" type="text/css" />
<script src="/assets/zoomFriendsAjax.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.js"></script>
</head>
<body>
<script src="/assets/sockets.js"></script>
<h2>Welcome To ZoomFriends</h2>
<div id="pagecontent">
<div id="serverform">
<form>
<label for="servercode"><strong>Server Code:</strong></label>
<input type="text" id="servercodeinput" name="servercode" placeholder="Insert your server code here..." required>
<label for="nickname"><strong>Your Nickname</strong></label>
<input type="text" id="nickname" name="nickname" placeholder="Insert your nickname here..." required>
<button type=submit>join room</button>
</form>
</div>
<div id="connpage">
<h2>Connected to server</h2>
<button id=startgame>Start Game if all players have joined!</button>
</div>
<div id="gamepage">
<h2>Game is Started</h2>
</div>
</div>
</body>
</html>
styles.css
body{
background: #0d1521;
font-family: tahoma;
color: #989898;
text-align: center;
}
#todo-table{
position: relative;
width: 95%;
background: #090d13;
margin: 0 auto;
padding: 20px;
box-sizing: border-box;
}
#todo-table form:after{
margin: 0;
content: '';
display: block;
clear: both;
}
#connpage{
display: none;
}
#gamepage{
display: none;
}
#servercodeinput{
text-transform: uppercase;
}
input::placeholder {
font-style: italic;
}
input[type="text"]{
width: 100%;
padding: 20px;
background:#181c22;
border: 0;
float: left;
font-size: 20px;
color: #989898;
text-align: center;
}
label{
width: 100%;
padding: 20px;
background:#23282e;
border: 0;
float: left;
font-size: 20px;
color: #989898;
text-align: center;
}
button{
padding: 20px;
width: 100%;
float: left;
background: #23282e;
border: 0;
box-sizing: border-box;
color: #fff;
cursor: pointer;
font-size: 80px;
}
ul{
list-style-type: none;
padding: 0;
margin: 0;
}
li{
width: 100%;
padding: 20px;
box-sizing: border-box;
font-family: arial;
font-size: 20px;
cursor: pointer;
letter-spacing: 1px;
}
li:hover{
text-decoration: line-through;
background: rgba(0,0,0,0.2);
}
h1{
background: url(/assets/logo.png) no-repeat center;
margin-bottom: 0;
text-indent: -10000px;
text-align: center;
}
sockets.js
//make connection
var socket = io.connect('95.97.158.61:4000');
最后是完整的ZoomFriendsController.js:
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
//Connect to database
mongoose.connect('mongodb+srv://SebastiaanVW:Test1234@todo-m1zp6.mongodb.net/test?retryWrites=true&w=majority', { useNewUrlParser: true , useUnifiedTopology: true })
//Create a schema - this is a blueprint
var roomSchema = new mongoose.Schema({
room: String
//players: Array
});
//create a model
var Rooms = mongoose.model('Room', roomSchema)
var urlencodedParser = bodyParser.urlencoded({extended: false});
//Start Functions
module.exports = function(app,io){
var rooms = [];
var myroomindex = -1;
//Check if socket is connected
io.on('connection',function(socket){
console.log('made socket connection:'+socket.id);
//if submit button is pressed on the login form
app.post('/button', urlencodedParser, function(req, res){
console.log(socket.id);
//put the player data in message variable
//var message = req.body.player;
//check if a roomcode exists with the entered roomcode
var found = rooms.some(el => el.roomcode === req.body.room);
//if it exists
if (found){
//find the index in the room array of that room
var targetindex = rooms.findIndex(element => element.roomcode === req.body.room);
//send a message to that room in unity that you want to join
io.to(rooms[targetindex].gamesocketid).emit('joinroom', {player: req.body.player, room: req.body.room, socket: socket.id});
//add the player to the players array of that room
rooms[targetindex].players.push({nickname: req.body.player, id: socket.id});
//log the addition of the player to the console
console.log('player ' + req.body.player + ' joined room ' + req.body.room + ' with socket ID ' + socket.id);
//Log the room itself to the console
console.log(rooms[targetindex]);
//send a response with the data. to tell you successfully added the player to ajax
res.json(rooms[targetindex]);
} else {
console.log('room not found');
res.json(rooms[targetindex]);
}
});
//if submit is pressed on the startgame button
app.post('/start', urlencodedParser, function(req, res){
console.log('game started');
var goingwell = true;
io.to(rooms[myroomindex].gamesocketid).emit('gamestarted',{started: true});
rooms[myroomindex].players.forEach(function(item,i){
var tempsocket = rooms[myroomindex].players[i].socket
console.log(tempsocket);
io.to(tempsocket).emit('gamestarted',{started: true});
});
res.json(goingwell);
});
socket.on('createroom',function(data){
JSON.stringify(data);
console.log('Game with socket id ' + socket.id + ' created a room with room code ' + data.roomcode );
var players = [];
rooms.push({roomcode: data.roomcode, gamesocketid: socket.id, players: players});
console.log(rooms);
//console.log('room code ' + RoomJSON.roomcode);
});
socket.on('destroyroom',function(data){
JSON.stringify(data);
console.log('Destroy a room with room code ' + data.roomcode );
rooms = rooms.filter(function(value){
return value.roomcode !== data.roomcode;
});
});
socket.on('gamestarted',function(data){
//res.render('gamestarted');
console.log('recieved gamestarted');
});
});
app.get('/', function(req, res){
res.render('rooms');
});
};
我知道那里有很多东西我还没有用,还有一些东西不起作用,比如myroomindex值。但现在我需要解决socketid问题。基本上我的所有玩家在我的数组中都得到了相同的socket ID。谢谢你看一看!你不能把
app.post('/button',…)
放在io.on里面('connection',…)
。无法以这种方式构建它。这意味着每次获得新的socket.io连接时,都会添加一个额外的重复app.post()
handler。然后,每当该路由被命中时,它们都将竞争该路由,只有安装的第一个将获胜,因此无论哪个客户端发送POST请求,它将始终使用连接的第一个socket.id
您必须记住,app.xxx()
为所有用户注册路由,这些路由在您的服务器的生命周期中是永久的。它们不仅仅适用于刚连接到socket.io的用户
相反,您需要将app.post()
移动到io.on('connection,…)
之外,以下是一些选项:
socket.id
(不太可取,因为它可能被欺骗)app.post()时,您可以从该cookie中获取它
我最喜欢的可能是#4。可能是与服务器和客户端相关的东西。也许……我不知道,这东西对我来说是新的,我只是把它拼凑起来了……谢谢,这是我所期望的,但很高兴有更有经验的人能为我澄清。当你说不要使用form post时,那会怎样,我需要一个球员的名字,房间号与socket.id相结合,以便能够来回发送消息并知道我在说谁。您能稍微澄清一下无post版本的工作原理吗?@SebastiaanvanWaardenberg-您仍然创建相同的HTML表单,但当用户按send或任何按钮时,您不会执行表单post。相反,您可以使用客户端Javascript从表单元素中获取数据值,将它们放入一个对象中,并通过socket.io消息将该数据发送到服务器。当服务器收到该消息时,它将准确地知道它来自哪个socket.io socket和socket.id。
$(document).ready(function(){
$('#serverform').on('submit', function(){
var player = $('input[type="text"]#nickname');
var room = $('input[type="text"]#servercodeinput');
var joindata = {player: player.val(), room: room.val().toUpperCase()};
$.ajax({
type: 'POST',
url: '/button',
data: joindata,
success: function(data){
//do something with the data via front-end framework
//location.reload();
//alert('button pressed');
serverconnected();
}
});
return false;
});
$('#startgame').on('click', function(){
//alert('button pressed');
var started = true;
$.ajax({
type: 'POST',
url: '/start',
data: started,
success: function(data){
//do something with the data via front-end framework
//location.reload();
gamestarted();
}
});
return false;
});
function serverconnected(){
$('#connpage').show();
$('#serverform').hide();
}
function gamestarted(){
alert('gamestarted function happening');
$('#gamepage').show();
$('#connpage').hide();
}
function nosuchroom(){
alert('Wrong Room Name');
}
});
body{
background: #0d1521;
font-family: tahoma;
color: #989898;
text-align: center;
}
#todo-table{
position: relative;
width: 95%;
background: #090d13;
margin: 0 auto;
padding: 20px;
box-sizing: border-box;
}
#todo-table form:after{
margin: 0;
content: '';
display: block;
clear: both;
}
#connpage{
display: none;
}
#gamepage{
display: none;
}
#servercodeinput{
text-transform: uppercase;
}
input::placeholder {
font-style: italic;
}
input[type="text"]{
width: 100%;
padding: 20px;
background:#181c22;
border: 0;
float: left;
font-size: 20px;
color: #989898;
text-align: center;
}
label{
width: 100%;
padding: 20px;
background:#23282e;
border: 0;
float: left;
font-size: 20px;
color: #989898;
text-align: center;
}
button{
padding: 20px;
width: 100%;
float: left;
background: #23282e;
border: 0;
box-sizing: border-box;
color: #fff;
cursor: pointer;
font-size: 80px;
}
ul{
list-style-type: none;
padding: 0;
margin: 0;
}
li{
width: 100%;
padding: 20px;
box-sizing: border-box;
font-family: arial;
font-size: 20px;
cursor: pointer;
letter-spacing: 1px;
}
li:hover{
text-decoration: line-through;
background: rgba(0,0,0,0.2);
}
h1{
background: url(/assets/logo.png) no-repeat center;
margin-bottom: 0;
text-indent: -10000px;
text-align: center;
}
//make connection
var socket = io.connect('95.97.158.61:4000');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
//Connect to database
mongoose.connect('mongodb+srv://SebastiaanVW:Test1234@todo-m1zp6.mongodb.net/test?retryWrites=true&w=majority', { useNewUrlParser: true , useUnifiedTopology: true })
//Create a schema - this is a blueprint
var roomSchema = new mongoose.Schema({
room: String
//players: Array
});
//create a model
var Rooms = mongoose.model('Room', roomSchema)
var urlencodedParser = bodyParser.urlencoded({extended: false});
//Start Functions
module.exports = function(app,io){
var rooms = [];
var myroomindex = -1;
//Check if socket is connected
io.on('connection',function(socket){
console.log('made socket connection:'+socket.id);
//if submit button is pressed on the login form
app.post('/button', urlencodedParser, function(req, res){
console.log(socket.id);
//put the player data in message variable
//var message = req.body.player;
//check if a roomcode exists with the entered roomcode
var found = rooms.some(el => el.roomcode === req.body.room);
//if it exists
if (found){
//find the index in the room array of that room
var targetindex = rooms.findIndex(element => element.roomcode === req.body.room);
//send a message to that room in unity that you want to join
io.to(rooms[targetindex].gamesocketid).emit('joinroom', {player: req.body.player, room: req.body.room, socket: socket.id});
//add the player to the players array of that room
rooms[targetindex].players.push({nickname: req.body.player, id: socket.id});
//log the addition of the player to the console
console.log('player ' + req.body.player + ' joined room ' + req.body.room + ' with socket ID ' + socket.id);
//Log the room itself to the console
console.log(rooms[targetindex]);
//send a response with the data. to tell you successfully added the player to ajax
res.json(rooms[targetindex]);
} else {
console.log('room not found');
res.json(rooms[targetindex]);
}
});
//if submit is pressed on the startgame button
app.post('/start', urlencodedParser, function(req, res){
console.log('game started');
var goingwell = true;
io.to(rooms[myroomindex].gamesocketid).emit('gamestarted',{started: true});
rooms[myroomindex].players.forEach(function(item,i){
var tempsocket = rooms[myroomindex].players[i].socket
console.log(tempsocket);
io.to(tempsocket).emit('gamestarted',{started: true});
});
res.json(goingwell);
});
socket.on('createroom',function(data){
JSON.stringify(data);
console.log('Game with socket id ' + socket.id + ' created a room with room code ' + data.roomcode );
var players = [];
rooms.push({roomcode: data.roomcode, gamesocketid: socket.id, players: players});
console.log(rooms);
//console.log('room code ' + RoomJSON.roomcode);
});
socket.on('destroyroom',function(data){
JSON.stringify(data);
console.log('Destroy a room with room code ' + data.roomcode );
rooms = rooms.filter(function(value){
return value.roomcode !== data.roomcode;
});
});
socket.on('gamestarted',function(data){
//res.render('gamestarted');
console.log('recieved gamestarted');
});
});
app.get('/', function(req, res){
res.render('rooms');
});
};