使用React Native客户端与nodejs服务器通过WebSocket进行通信

使用React Native进行WebSocket通信

在App Engine的可扩展环境中,使用nodejs搭建WebSocket服务器,并从React Native客户端连接到该服务器。我几乎可以根据示例代码创建,但遇到了一点小问题。这里我将写到与本地的nodejs服务器进行通信的部分。

服务器 fú qì)

请参考以下链接:
https://github.com/GoogleCloudPlatform/nodejs-docs-samples/tree/master/appengine/websockets

暂时先在本地尝试直接运行。
克隆,移动,并运行。

git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
cd nodejs-docs-samples/appengine/websockets/
yarn install && yarn start

通过浏览器访问localhost:8080,您将能够看到WebSocket消息客户端的界面,因此您可以在两个浏览器中打开并尝试实际的消息交互。我们将通过ReactNative客户端连接到此服务器。

スクリーンショット 2020-08-09 15.54.49.png

客户

我将简单创建一个客户端并连接到服务器进行尝试。安装expo-cli,

expo init

然后,创建一个空白项目并切换到项目文件夹,在App.tsx中进行如下更改(这是一个用于尝试WebSocket的最基本示例)。如果从手机上扫描二维码进行测试,则URL应指定本地机器的IP地址(在本地运行服务器端时)。
以下使用了socket.io-client库。虽然我认为使用标准库的WebSocket也可以工作,但是出了些问题。

import { StatusBar } from 'expo-status-bar';
import React from 'react';
import { StyleSheet, Text, View, TextInput, TouchableOpacity, Alert } from 'react-native';
import socketIOClient from "socket.io-client";

export default class App extends React.Component {

socket

constructor(props) {
    super(props);
    this.state = {text: ""}
}

componentDidMount(){
this.socket = socketIOClient("ws://192.xxx.xxx.xxx:8080");
//  this.socket = socketIOClient("https://'app engine project id'.appspot.com");

const _that = this;

this.socket.on('message', function(data){ 
    console.log('recieve', data)
    Alert.alert("Message recieved. " + JSON.stringify(data))
});
}

sendMessage(){
    if(!this.state.text){
    Alert.alert('Please input message')
    return;
    }
    this.socket.emit('message', this.state.text);
}

render() {
    return (<View style={styles.container}>
    <TextInput onChangeText={(text) => this.setState({text: text}) } 
    style={styles.input}></TextInput>
    <TouchableOpacity style={styles.button}
    onPress={() => this.sendMessage()}><Text>Click to send Message</Text></TouchableOpacity>
    </View>)
}
}

const styles = StyleSheet.create({
container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
},
input: {
    height: 40, borderColor: 'gray', borderWidth: 1 , width: '100%'
},
button: {
    backgroundColor: "#888",  height: 40, width: "100%", marginTop: 10, alignItems: 'center',padding: 'auto'
}
});

然后,通过 yarn add socket.io-client 来添加库,并通过 yarn start 来启动客户端。

应用引擎

将此示例服务器部署到AppEngine非常简单,因为服务器源代码中已包含app.yml。只需在文件夹nodejs-docs-samples/appengine/websockets/下运行gcloud app deploy即可。对于ReactNative客户端,将URL更改为实际的URL。

建议立即删除不再使用的服务器。我曾经让它一直运行,结果产生了数千元的使用费用。AppEngine的flux环境可能需要一些费用吧?可能与WebSocket有关?

广告
将在 10 秒后关闭
bannerAds