Je suis nouveau dans React Native, mais je connais très bien React. En tant que débutant, je cherche à configurer une connexion entre un serveur cloud et une réaction native avec les websockets, comme je l’ai vu dans la documentation. Malheureusement, il n'y a pas d'exemple décent qui pourrait m'aider. C'est tout ce que j'ai jusqu'ici:
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
Button
} from 'react-native';
export default class raspberry extends Component {
constructor(props) {
super(props);
this.state = { open: false };
this.socket = new WebSocket('ws://127.0.0.1:3000');
this.emit = this.emit.bind(this);
}
emit() {
this.setState(prevState => ({ open: !prevState.open }))
this.socket.send("It worked!")
}
render() {
const LED = {
backgroundColor: this.state.open ? 'lightgreen' : 'red',
height: 30,
position: 'absolute',
flexDirection: 'row',
bottom: 0,
width: 100,
height: 100,
top: 120,
borderRadius: 40,
justifyContent: 'space-between'
}
return (
<View style={styles.container}>
<Button
onPress={this.emit}
title={this.state.open ? "Turn off" : "Turn on"}
color="#21ba45"
accessibilityLabel="Learn more about this purple button"
/>
<View style={LED}></View>
</View>
);
}
componentDidMount() {
this.socket.onopen = () => socket.send(JSON.stringify({ type: 'greet', payload: 'Hello Mr. Server!' }))
this.socket.onmessage = ({ data }) => console.log(JSON.parse(data).payload)
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
instructions: {
textAlign: 'center',
color: '#333333',
marginBottom: 5,
},
});
AppRegistry.registerComponent('raspberry', () => raspberry);
Tout fonctionne bien, mais lorsque j'appuie sur le bouton pour envoyer un message, c'est l'erreur que je reçois:
Impossible d'envoyer un message. Identifiant WebSocket inconnu 1
J'ai également fait un test avec un client js et tout a fonctionné sans heurts .. cherchant à voir comment je pourrais obtenir ce correctif ou quelques exemples de sources où je pourrais le comprendre.
changer le code
socket.send(JSON.stringify({ type: 'greet', payload: 'Hello Mr. Server!' }))
à
this.socket.send(JSON.stringify({ type: 'greet', payload: 'Hello Mr. Server!' }))
ça devrait marcher.
voici mon code à tester, basé sur votre code et la RN 0.45 (et le projet généré par create-react-native-app), se connecte à un serveur Websocket public wss://echo.websocket.org/
, sur mon Android cela fonctionne bien et je peux voir l'écho du serveur Websocket message après que j'appuie sur le bouton.
import React, { Component } from 'react';
import {
StyleSheet,
Text,
View,
Button
} from 'react-native';
export default class App extends React.Component {
constructor() {
super();
this.state = {
open: false
};
this.socket = new WebSocket('wss://echo.websocket.org/');
this.emit = this.emit.bind(this);
}
emit() {
this.setState(prevState => ({
open: !prevState.open
}))
this.socket.send("It worked!")
}
componentDidMount() {
this.socket.onopen = () => this.socket.send(JSON.stringify({type: 'greet', payload: 'Hello Mr. Server!'}));
this.socket.onmessage = ({data}) => console.log(data);
}
render() {
const LED = {
backgroundColor: this.state.open
? 'lightgreen'
: 'red',
height: 30,
position: 'absolute',
flexDirection: 'row',
bottom: 0,
width: 100,
height: 100,
top: 120,
borderRadius: 40,
justifyContent: 'space-between'
}
return (
<View style={styles.container}>
<Button onPress={this.emit} title={this.state.open
? "Turn off"
: "Turn on"} color="#21ba45" accessibilityLabel="Learn more about this purple button"/>
<View style={LED}></View>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF'
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10
},
instructions: {
textAlign: 'center',
color: '#333333',
marginBottom: 5
}
});
Selon documentation , vous devez ajouter l'état connected
à votre composant. Et envoyez quoi que ce soit si connected
state est vrai.
export default class raspberry extends Component {
constructor(props) {
super(props);
this.state = {
open: false,
connected: false
};
this.socket = new WebSocket('ws://127.0.0.1:3000');
this.socket.onopen = () => {
this.setState({connected:true})
};
this.emit = this.emit.bind(this);
}
emit() {
if( this.state.connected ) {
this.socket.send("It worked!")
this.setState(prevState => ({ open: !prevState.open }))
}
}
}
Après quelques recherches, j’ai trouvé que le WebSocket devrait être
new WebSocket("ws://10.0.2.2:PORT/")
où 10.0.2.2
signifie la localhost