及时聊天功能渐渐的几乎成为每个APP的标配功能了,最近想给自己的APP增加即时聊天功能。本想调用一些云服务的聊天接口,看了下价格,接受不了。那就自己尝试写一个吧!我的应用场景比较简单,最多同时在线也就1000人左右。
实现思路- 前端react实现,数据发生变化界面自动变,做起来会比较简单。
- 第一版,定时刷新http的方式取数据即可,这种方式缺点比较多,但是目前用户量比较小的情况下,影响不大,后期换成websocket 实现。
为了方便查看,服务器端请求的代码被我暂时注释,需要的自行打开注释。
/* eslint-disable prettier/prettier */ import React, {useState, useEffect} from 'react'; import { SafeAreaView, StyleSheet, ScrollView, View, Text, StatusBar, TextInput, Button, } from 'react-native'; function MessageList(props) { const items = props.items; const receiver = props.receiver; const listItems = items.map((item, index) => { return ( {item.name}{item.message}); }, ); return ( <>{listItems} ); } const URL_SERVER = 'http://192.168.199.133:8080'; const App = () => { const [items, setItems] = useState([ {name: 'boy', message: '今天晚上吃点啥?'}, {name: 'girl', message: '我们去吃牛排吧!'}, {name: 'boy', message: '好的,我去给小红打气。'}, {name: 'boy', message: '你们在门口等我吧。'}, {name: 'girl', message: '你人呢?我到门口啦'}, ]); const [receiver, setReceiver] = useState('girl'); const [value, onChangeText] = React.useState(''); let timer; //计时器 useEffect(() => { //loadMessage(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); /** * 加载聊天信息 */ const loadMessage = () => { timer = setInterval(function () { //执行代码 console.log('-----------获取数据------------'); fetch(URL_SERVER + '/list') .then(function (response) { return response.json(); }) .then(function (result) { if (result.code == 0) { setItems(result.data); } }); }, 1000); }; const postMessage = () => { fetch(URL_SERVER+'/send', { method: 'POST', credentials: 'include', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: 'roomId=1&message=' + value + '&name=' + receiver, }) .then(response => { if (response.ok) { return response.text(); } throw new Error('Network response was not ok.'); }) .then(responseText => { console.log(responseText); }) .catch(e => { console.log(e.toString()); }); }; //发送消息 const sendMessage = (message) => { let newItems = JSON.parse(JSON.stringify(items)); newItems.push({name: receiver, message: message}); setItems(newItems); }; const sendDo = () => { sendMessage(value); //postMessage(); onChangeText(''); }; return ( <>{height: 40, borderColor: 'gray', borderWidth: 1}} onChangeText={text => setReceiver(text)} placeholder={'聊天人姓名'} value={receiver} onSubmitEditing={sendDo} />{height: 15}}>{height: 40, borderColor: 'gray', borderWidth: 1}} onChangeText={text => onChangeText(text)} placeholder={'开始聊天吧'} value={value} onSubmitEditing={sendDo} /> ); }; const styles = StyleSheet.create({ mainContent: { flex: 1, backgroundColor: '#ededed', }, chatBody: { flex: 1, padding: 10, }, chatMessage: { position: 'relative', backgroundColor: '#ffffff', padding: 10, borderRadius: 10, alignSelf: 'flex-start', marginBottom: 25, }, chatReceiver: { marginLeft: 'auto', backgroundColor: '#95ec69', }, messageText: { fontSize: 16, }, chatName: { fontSize: 12, position: 'absolute', top: -15, fontWeight: 'bold', }, chatNameReceiver: { fontSize: 12, position: 'absolute', top: -18, fontWeight: 'bold', marginLeft: 'auto', }, chatTimeStamp: { marginLeft: 10, fontSize: 12, }, }); export default App;
程序目前比较简陋,思路仅供参考。