У меня есть функция тестирования на стороне клиента, которая отправляет тестовый объект на сервер socket.io, задачей которого является ожидание события клиента, а затем отправляет данные каждому клиенту в комнате, которую исходный клиент отправилсобытие от.Однако только исходный клиент получает событие с сервера.другой клиент в комнате не получает его.
Я пробовал как io.in(room).emit()
, так и io.to(room).emit()
на стороне сервера.оба клиента определенно присоединяются к одной комнате.и сервер также получает событие от инициирующего клиента.
Server.js:
const express = require("express");
const app = express();
const server = require("http").createServer(app);
const io = require("socket.io").listen(server);
const port = process.env.PORT || 3000;
io.on("connection", socket => {
console.log("user connected: " + socket.id);
socket.on("test", test => {
console.log("received from client, emitting to room: " + test.room);
// io.to(test.room).emit("test", {key: "property from server"}
// io.in(test.room).emit("test", {key: property from server"}
})
})
server.listen(port, () => {
console.log("server running on port: " + port);
});
Родительский компонент:
const socket = io("http://172.31.99.250:3000");
export default class Lobby extends React.Component {
constructor(props) {
super(props);
this.state = {
username: "",
queue: [],
playerOne: null,
playerTwo: null,
currentMove: "",
matchFound: false,
room: null
};
}
componentDidMount() {
this.joinLobby();
}
joinLobby() {
socket.emit("findMatch() )
socket.on("matchFound", data => {
this.setState({
currentMove: data.currentMove,
playerOne: data.p1,
playerTwo: data.p2,
matchFound: true,
room: data.gameId
});
});
render() {
return this.state.matchFound == true ? (
<ChildComponent
room={this.state.room}
socket={socket}
/>
);
}
}
Дочерний компонент:
export default class GameBoard extends Component {
constructor(props) {
super(props);
this.state = {
inProgress: true,
msg: null
}
componentDidMount() {
alert("Room ID: " + this.props.room);
}
onTest = () => {
this.props.socket.emit("test", {
testKey: "testProperty",
room: this.props.room
});
this.props.socket.on("test", response => {
alert("response received: " + response.key);
});
};
render() {
<View>
<TouchableOpacity
onPress={this.onTest}
/>
</View>
}
}
Я ожидаю, что сообщение сервера будетчитать на обоих подключенных клиентах: каждый клиент в комнате, из которой было отправлено исходное событие, однако только сервер-отправитель получает сообщение сервера, а не второй клиент в той же комнате