- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Socket.io 创建多人游戏。我使用生成的数字代码来动态创建和加入房间。
我的问题是向特定房间甚至特定客户发出信号。我无法发送到房间(io.in(room).emit('event')
或 io.to(room).emit('event')
它们是同义词)。不过,我可以在服务器和客户端之间socket.emit('event')
正常工作。没有错误。当我使用除了 socket.emit()
、io.emit()
和 socket.on('',function(){ this 之外的任何东西时,什么也不会发生.emit(); })
.
我必须发送到特定房间的原因是当新客户加入时更新其房间中的所有客户。 (我曾尝试向每个房间中的每个 socket.id 发送信息,但这不起作用)。
browser debugger tracking server emitted events
我已经上传了我在 Node.js 服务器中使用的所有代码,希望有人可以看到我程序中的错误。我是 Socket.io 的新手,我不确定我设置动态房间的有效性。
不起作用的房间事件是:connectToRoom
服务器
var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/',function(req, res) {
res.sendFile(__dirname + '/client/index.html');
});
app.use('/client',express.static(__dirname + '/client'));
http.listen(3000, function(){
console.log('listening on localhost:3000');
});
io.on('connection', function(socket){
socket.id = Math.random();
SOCKET_LIST[socket.id]=socket;
socket.on('create',function(){
var thisGameId = ( Math.random() * 100000 ) | 0;
roomNo+=1;
roomArr[thisGameId]=thisGameId;
this.emit('createResponse', {gameId: thisGameId, mySocketId: socket.id});
this.join(thisGameId.toString());
});
socket.on('joinRoom',function(data){
//playerJoinGame(data);
//io.sockets.in(data.roomKey.toString()).emit('connectToRoom', "You are in room no. "+data.roomKey);
//socket.to(data.roomKey.toString()).emit('connectToRoom', "You are in room no. "+data.roomKey);
if( io.nsps['/'].adapter.rooms[data.roomKey]!== undefined ){
socket.join(data.roomKey.toString());
SOCKET_LIST[socket.id].username = data.username;
this.emit('joinRoomResponse',{
roomKey:data.roomKey
});
}
if(io.nsps['/'].adapter.rooms[data.roomKey]=== undefined){
this.emit('joinError',{
message: "This room does not exist."
});
}
});
socket.on('updateRoom',function(data){
var clients=io.sockets.adapter.rooms[data.roomKey].sockets;
var clientsArr=Object.keys(clients);
for (var clientId in clientsArr ) {
io.sockets.connected[clientsArr[clientId]].emit('connectToRoom', {
roomKey:data.roomKey,
username:data.username
});
}
io.sockets.in(data.roomKey).emit('connectToRoom', {
roomKey:data.roomKey,
username:data.username
});
});
socket.on('disconnect',function(){
delete SOCKET_LIST[socket.id];
});
});
客户端
var socket = io();
var roomKey,username,mySocketId;
var optionDiv = document.getElementById('optionDiv');
var optionDivCreate = document.getElementById('optionDiv-create');
var optionDivJoin = document.getElementById('optionDiv-join');
var prepDiv = document.getElementById('prepDiv');
var createDiv = document.getElementById('create-Div');
var lobbyDiv = document.getElementById('lobbyDiv');
var createRoomKey = document.getElementById('create-roomKey');
var createPlayers = document.getElementById('create-players');
var joinForm = document.getElementById('join-form');
var joinForm_roomKey = document.getElementById('join-roomKey');
var joinForm_username = document.getElementById('join-username');
var joinForm_submit = document.getElementById('join-form-submit');
var gameDiv = document.getElementById("gameDiv");
optionDivCreate.onclick=function(){
socket.emit('create');
};
optionDivJoin.onclick=function(){
optionDiv.style.display='none';
prepDiv.style.display='inline-block';
joinForm.style.display='inline-block';
};
socket.on('createResponse',function(data){
roomKey = data.gameId;
mySocketId = data.mySocketId;
optionDiv.style.display='none';
prepDiv.style.display='inline-block';
createDiv.style.display='inline-block';
createRoomKey.innerHTML = roomKey;
});
joinForm_submit.onclick= function(){
};
joinForm.onsubmit = function(e){
e.preventDefault();
roomKey = joinForm_roomKey.value;
username = joinForm_username.value;
socket.emit('joinRoom',{
roomKey:roomKey,
username:username
});
joinForm_roomKey.value='';
joinForm_username.value='';
};
socket.on('joinRoomResponse',function(data){
optionDiv.style.display='none';
createDiv.style.display='none';
prepDiv.style.display='none';
lobbyDiv.style.display='inline-block';
socket.emit('updateRoom',{
roomKey:roomKey,
username:username
});
});
socket.on('connectToRoom',function(data){
socket.emit('debug');
//createPlayers.innerHTML = "<br />"+data.username;
alert("triggered");
});
socket.on('joinError',function(data){
alert(data.message);
});
HTML
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>Prototype</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="optionDiv" style="">
<button id="optionDiv-create">Create Game</button><br />
<button id="optionDiv-join">Join Game</button>
</div>
<div id="prepDiv" style="display:none;">
<div id="create-Div" style="display:none;">
Room Key:<br />
<h1 id="create-roomKey"></h1>
<h1 id="create-players"></h1>
</div>
<form id="join-form" style="display:none;">
Username:<br />
<input id="join-username" type="text" style="width:500px"></input><br />
Room Key:<br />
<input id="join-roomKey" type="text" style="width:500px"></input><br />
<button id="join-form-submit">Join</button>
</form>
</div>
<div id="lobbyDiv" style="display:none;">
You are in room:<br />
<h1 id="join-roomKey"></h1><br />
Players in room:<br />
<h1 id="join-players"></h1>
</div>
<div id="gameDiv" style="display:none;">
<div id="gameDiv-canvas">
<canvas id="ctx" width="500" height="500" style="border:1px solid #000000;">
</canvas>
</div>
<div id="gameDiv-chat">
<div id="chat-text" style="width:500px;height:100px;overflow-y:scroll">
<div>
Hello!
</div>
</div>
<form id="chat-form">
<input id="chat-input" type="text" style="width:500px"></input>
</form>
</div>
</div>
<!--<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.2/socket.io.js"></script>-->
<script src="/socket.io/socket.io.js"></script>
<script src="/client/js/client.js"></script>
</body>
</html>
最佳答案
正确的语法如下:
io.to('some room').emit('some event');
关于javascript - 无法发送到特定房间和客户端(Socket.io 2.0.2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44461326/
我在使用 Room 或 idk 时遇到问题,实际上问题出在哪里,我需要帮助找出问题出在哪里,我正在使用 Hilt DI,创建数据库实例的那一刻它崩溃了这是我的代码 错误 E/AndroidRuntim
我有一个关于数据结构和类设计的问题(抱歉太长了)。为了简单起见,假设这是一个游戏,我想在房间之间导航(想象一系列 2D 非滚动屏幕,例如早期的银河战士/恶魔城)。每个房间可以有许多导出(例如上、下、左
我使用当前日期(1-25)作为父ID并使用房间(08-00_11-00_karpet1-)作为 child ID。该数据库中包含在该日期(父 ID)订购该房间(子 id)的用户信息。 问题1 使用此布
在我的 Android 项目中,我使用 Room 库来处理 SQLite 数据库。我使用我的数据库来保存国家电话代码。我的数据库预装了两个国家(观看 populateDatabaseWithCount
我正在尝试将 Room 持久性库添加到 Android 应用程序项目中。在 build.gradle 文件中,我添加了以下依赖项: implementation 'android.arch.persi
人们可以提前从 25 场讲座中选择最多 5 场。所有这些讲座都在五个房间的五个时间段内在一天内进行。听众可以参加的每个(首选)讲座都让她更快乐,他选择但不能参加的每个讲座(因为另一个首选讲座在同一时间
我在 Android 上使用 OrmLite 而不是 SQLite 和 SQLCipher 来加密数据库。有没有办法加密 Room 数据库? 最佳答案 默认情况下,Room 将数据存储在应用程序的内部
使用 Room ORM,我使用 @Entity 注释声明了一个实体 EQPreset。该实体包含一个数组 int[]。它给出以下错误: 错误:无法确定如何将此字段 (int[] arr) 保存到数据库
我正在尝试构建一个管理 child 托儿所的应用程序,特别是管理哪个 child 在哪个时间点在托儿所的哪个房间里。 Nursery 链式店有多个分支机构。每个分店有几个房间,每个房间对应一个年龄段,
我在生产环境中遇到了“android.database.sqlite.SQLiteDatabaseLockedException”异常。错误分析时出现异常。我的项目数据库有空间。项目中没有使用多进程。
我想实现 Android Room 持久性。 这是我的 DAO 界面。 @Dao interface FoodDao { /** * Returns all data in tabl
我正在尝试使用 Room 数据库和 LiveData。我有 ViewModels,它保存从 dao 获得的 LiveData。如果我更新Transaction ,然后LiveData>观察正常,但是
在 Firebase ,创建“房间”(例如用于聊天)很容易,正如其各种示例中所记录的那样。 对于聊天的数据结构,我会使用这样的东西: rooms room1 member_co
我试图从 Activity 中将一行插入 SQLITE 数据库,然后返回要存储在 Activity 中的变量中的 rowId。请参阅下面我使用的方法和逻辑。 private void insert
我正在使用 XMPPFramework 开发聊天应用程序 加入现有房间后如何接收消息历史记录? 现在我像这样加入房间: XMPPJID *roomJid = [XMPPJID jidWithStrin
我在我的应用程序中使用 Room 并将数据插入到我的数据库中时 ConcurrentModificationException有时会被抛出。为什么会这样? 我使用分页 api,在每次 api 调用后,
我想为 pb 添加值,由于将 pb_value 包含到实体中,应用程序崩溃了。我是学习室的新手,我不确定将额外项目合并到数据库中的正确方法。 E/AndroidRuntime: FATAL EXCEP
我想在当前 pb 中添加值、日期和详细信息。我在 pbInfo 的数据库中收到错误“冲突声明”。我应该如何修复此错误? @Entity(tableName = "pb_table") data cla
我正在尝试制作一个聊天应用程序,用户可以在其中聊天。我想将两个用户 uid 字符串插入函数并返回一个连接的字符串。但我希望以某种方式组织 uid,以便返回的值始终相同。 func (id1, id2)
我不断收到以下错误: Cannot figure out how to save this field into database. You can consider adding a type co
我是一名优秀的程序员,十分优秀!