websocket.dart 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'dart:math';
  4. import 'package:flustars/flustars.dart' as FlutterStars;
  5. import 'package:flutter/foundation.dart';
  6. import 'package:flutter/material.dart';
  7. import 'package:liftmanager/common/common.dart';
  8. import 'package:liftmanager/routers/fluro_navigator.dart';
  9. import 'package:liftmanager/utils/fast_notification.dart';
  10. import 'package:liftmanager/utils/log_util.dart';
  11. import 'package:liftmanager/utils/toast.dart';
  12. import 'package:liftmanager/utils/url.dart';
  13. import 'package:shared_preferences/shared_preferences.dart';
  14. import 'package:web_socket_channel/io.dart';
  15. class WebSocketProvide with ChangeNotifier {
  16. List<dynamic> historyMessageqqq = []; //接收到哦的所有的历史消息
  17. List<String> historyMessageString = []; //接收到哦的所有的历史消息
  18. var connecting = false; //websocket连接状态
  19. IOWebSocketChannel channel;
  20. String roomId;
  21. bool socketIsConnect = false;
  22. bool isSend = true;
  23. Timer _timer;
  24. void startTimer() {
  25. //设置 10 秒回调一次
  26. const period = const Duration(seconds: 10);
  27. _timer = Timer.periodic(period, (timer) {
  28. initLoop();
  29. });
  30. }
  31. void cancelTimer() {
  32. if (_timer != null) {
  33. print('websocket CancelTimer');
  34. _timer.cancel();
  35. _timer = null;
  36. }
  37. print('websocket CancelTimer2');
  38. }
  39. @override
  40. void dispose() {
  41. super.dispose();
  42. cancelTimer();
  43. }
  44. // DartNotificationCenter.subscribe(
  45. // channel: CHANNEL_NAME,
  46. // observer: i,
  47. // onNotification: (result) => print('received: $result'),
  48. // );
  49. // DartNotificationCenter.post(
  50. // channel: CHANNEL_NAME,
  51. // options: 'with options!!',
  52. // );
  53. void createWebsocket(roomIdss) async {
  54. //创建连接并且发送鉴别身份信息
  55. // print(JsonEncoder().convert(historyMessageString));
  56. // historyMessageString = [];
  57. // historyMessageqqq = [];
  58. // roomId= roomId;
  59. print(666664);
  60. // FlutterStars.SpUtil.putObject("sessionIdObj", res);
  61. // SharedPreferences prefs = await SharedPreferences.getInstance();
  62. // if(prefs.get(roomIdss)==null){
  63. // prefs.setStringList(roomIdss, historyMessageString);
  64. // }else {
  65. // historyMessageString = prefs.getStringList(roomIdss);
  66. // }
  67. // print(JsonEncoder().convert(historyMessageqqq));
  68. // LogUtil.d(historyMessageString);
  69. // print(4444);
  70. try {
  71. channel = await new IOWebSocketChannel.connect(socketUrl);
  72. var objs = {
  73. "cmd": "LOGINALL",
  74. "type": 1,
  75. "avatarUrl": FlutterStars.SpUtil.getString("avatarUrl"),
  76. "time": DateTime.now().millisecondsSinceEpoch,
  77. "fromUser": FlutterStars.SpUtil.getString(Constant.userId),
  78. "userId": FlutterStars.SpUtil.getString(Constant.userId),
  79. "name": FlutterStars.SpUtil.getString("username"),
  80. "sessionid": roomIdss,
  81. // "sessionid":roomId,
  82. "msg": "我是app端初始化"
  83. };
  84. String text = json.encode(objs).toString();
  85. channel.sink.add(text);
  86. //监听到服务器返回消息
  87. channel.stream.listen((data) => listenMessage(data),
  88. onError: onError, onDone: onDone);
  89. if (!socketIsConnect && !isSend) {
  90. String initThisSocket = randomInt(1111, 9999).toString() +
  91. DateTime.now().millisecondsSinceEpoch.toString();
  92. FastNotification.push("initSocket", initThisSocket);
  93. isSend = true;
  94. print('websocket重连');
  95. }
  96. // else {
  97. // startTimer();
  98. // }
  99. cancelTimer();
  100. startTimer();
  101. socketIsConnect = true;
  102. } catch (e) {
  103. socketIsConnect = false;
  104. print(e);
  105. }
  106. }
  107. //缓存历史消息
  108. void setStringEvent(id, strList) async {
  109. SharedPreferences prefs = await SharedPreferences.getInstance();
  110. prefs.setStringList(id, strList);
  111. LogUtil.d(prefs.getStringList(id));
  112. print(414141);
  113. }
  114. void setOnlineUserEvent(id, strOnlineList) async {
  115. SharedPreferences prefs = await SharedPreferences.getInstance();
  116. // prefs.setString(id, strOnlineList);
  117. FlutterStars.SpUtil.putString(id, strOnlineList);
  118. LogUtil.d(strOnlineList);
  119. // LogUtil.d(prefs.getString(id));
  120. print(414141);
  121. }
  122. //用户头像显示
  123. // void getOnlineUserEvent(id)async{
  124. // SharedPreferences prefs = await SharedPreferences.getInstance();
  125. // // String userStr = prefs.getString(id+"userOnline");
  126. // String userStr = FlutterStars.SpUtil.getString(id+"userOnline");
  127. // // List<dynamic>setUserList = userStr.map((item)=>jsonDecode(item)).toList();
  128. // if(userStr!=null&&userStr!=""){
  129. // List<dynamic>setUserList = jsonDecode(userStr);
  130. // FastNotification.push("set_user",setUserList);
  131. // // LogUtil.d(prefs.getString(id+"userOnline"));
  132. // print(33333);
  133. // }
  134. // }
  135. randomInt(int min, int max) {
  136. return new Random().nextInt(max) % (max - min + 1) + min;
  137. }
  138. void getStringEvent(obj, data) async {
  139. SharedPreferences prefs = await SharedPreferences.getInstance();
  140. // if(prefs.getStringList(roomId)==null){
  141. // prefs.setStringList(roomId, []);
  142. // }else {
  143. // historyMessageString = prefs.getStringList(roomId);
  144. // }
  145. // historyMessageString = prefs.getStringList(roomId);
  146. // LogUtil.d(historyMessageString);
  147. // print(456741);
  148. // LogUtil.d(data);
  149. if (obj["cmd"] == "CHAT") {
  150. //正常消息
  151. // historyMessageString.add(data.toString());
  152. // setStringEvent(roomId,historyMessageString);
  153. // print(JsonEncoder().convert(prefs.getStringList(obj["sessionid"])));
  154. String friendsInit = randomInt(1111, 9999).toString() +
  155. DateTime.now().millisecondsSinceEpoch.toString();
  156. print(123);
  157. List<String> strChat;
  158. print(prefs.getStringList(obj["sessionid"]));
  159. // ignore: unrelated_type_equality_checks
  160. if (prefs.getStringList(obj["sessionid"]) != "" &&
  161. prefs.getStringList(obj["sessionid"]) != null) {
  162. strChat = prefs.getStringList(obj["sessionid"]);
  163. } else {
  164. strChat = [];
  165. FastNotification.push("friendAction", friendsInit);
  166. }
  167. print(JsonEncoder().convert(data));
  168. print("JsonEncoder().convert(data)---------------------");
  169. strChat.add(data);
  170. // strChat.add(JsonEncoder().convert(data));
  171. // strChat.add(json.encode(data).toString());
  172. setStringEvent(obj["sessionid"], strChat);
  173. if (obj["sessionid"] == roomId) {
  174. historyMessageString = strChat;
  175. print(222220);
  176. historyMessageqqq =
  177. historyMessageString.map((item) => jsonDecode(item)).toList();
  178. FastNotification.push("chat_room_chat", historyMessageqqq);
  179. }
  180. prefs.setString("changeRoomId", obj["sessionid"]);
  181. FastNotification.push("friendAction", friendsInit);
  182. }
  183. // else if(obj["cmd"] =="UNREAD"){
  184. // //离线消息
  185. // Map<String,dynamic>msgObj = jsonDecode(obj["msg"]);
  186. // // print(JsonEncoder().convert(historyMessageqqq));
  187. // msgObj.forEach((key, value) {
  188. // List<String>str = [];
  189. // if(prefs.getStringList(key) != null){
  190. // str = prefs.getStringList(key);
  191. // }
  192. // String strUserOnline;
  193. // // if(prefs.getString(key+"userOnline") != null){
  194. // // strUserOnline = prefs.getString(key+"userOnline");
  195. // // }
  196. // print(jsonEncode(value));
  197. // print("--------------------------------------///123456");
  198. // // value.forEach((key,item){
  199. // // if(value[key]["msgList"].length>0){
  200. // // // str.add(JsonEncoder().convert(item["msgList"]));
  201. // // item["msgList"].forEach((ii){
  202. // // str.add(JsonEncoder().convert(ii));
  203. // // });
  204. // // // str.add(item["msgList"].toString());
  205. // // }
  206. // // // if(item["flag"]){
  207. // // // strUserOnline.add(item.toString());
  208. // // // }
  209. // // });
  210. // if(value["msgList"].length>0){
  211. // // str.add(JsonEncoder().convert(item["msgList"]));
  212. // value["msgList"].forEach((ii){
  213. // str.add(JsonEncoder().convert(ii));
  214. // });
  215. // // str.add(item["msgList"].toString());
  216. // }
  217. // // strUserOnline = value.toString();
  218. // strUserOnline = JsonEncoder().convert(value);
  219. // setStringEvent(key,str);
  220. // setOnlineUserEvent(key+"userOnline",strUserOnline);
  221. // });
  222. // LogUtil.d(msgObj);
  223. // // print("456456111------------------------");
  224. // // msgList.forEach((item){
  225. // // historyMessageString.add(jsonEncode(item));
  226. // // });
  227. // // setStringEvent();
  228. // }
  229. else if (obj["cmd"] == "INITROOM") {
  230. List<dynamic> msgListInitRoom = jsonDecode(obj["msg"]);
  231. if (msgListInitRoom != null && msgListInitRoom != []) {
  232. List<String> strList = [];
  233. msgListInitRoom.forEach((item) {
  234. strList.add(JsonEncoder().convert(item));
  235. });
  236. setStringEvent(obj["sessionid"], strList);
  237. print(JsonEncoder().convert(msgListInitRoom));
  238. print(prefs.getStringList(obj["sessionid"]));
  239. print("JsonEncoder().convert(INITROOM)---------------------");
  240. historyMessageqqq = msgListInitRoom;
  241. FastNotification.push("chat_room", historyMessageqqq);
  242. String friendsInit = randomInt(1111, 9999).toString() +
  243. DateTime.now().millisecondsSinceEpoch.toString();
  244. FastNotification.push("friendAction", friendsInit);
  245. }
  246. }
  247. }
  248. void listenMessage(data) {
  249. try {
  250. connecting = true;
  251. var obj = jsonDecode(data);
  252. // if(obj["sessionid"] != roomId){
  253. historyMessageString = [];
  254. historyMessageqqq = [];
  255. // }
  256. getStringEvent(obj, data);
  257. print(222219);
  258. print(data);
  259. } catch (e) {}
  260. //触发通知
  261. notifyListeners();
  262. }
  263. void sendMessage(context, {msg, id, msgType, dataTable, toUserId, recordingDuration}) {
  264. //发送消息
  265. // FocusScope.of(context).requestFocus(FocusNode());
  266. if (!socketIsConnect) {
  267. showAlert(
  268. context,
  269. "提示",
  270. "聊天室已断开,是否重新连接",
  271. "确定",
  272. () {
  273. // Navigator.of(context)..pop()..pop();
  274. // // setExtAddress(address+","+coord.latitude.toString()+","+coord.longitude.toString());
  275. // String setAddress = address +
  276. // "," +
  277. // coord.latitude.toString() +
  278. // "," +
  279. // coord.longitude.toString();
  280. // FastNotification.push("set_address", setAddress);
  281. createWebsocket(roomId);
  282. NavigatorUtils.goBack(context);
  283. },
  284. txt2: "取消",
  285. onPre2: () {
  286. NavigatorUtils.goBack(context);
  287. },
  288. );
  289. return;
  290. }
  291. roomId = id;
  292. // print(JsonEncoder().convert(roomId));
  293. // print(555);
  294. var objs = {
  295. "cmd": "CHAT",
  296. "type": msgType,
  297. "dataTable": dataTable,
  298. "receiver": toUserId,
  299. "avatarUrl": FlutterStars.SpUtil.getString("avatarUrl"),
  300. "time": DateTime.now().millisecondsSinceEpoch,
  301. "fromUser": int.parse(FlutterStars.SpUtil.getString(Constant.userId)),
  302. "userId": int.parse(FlutterStars.SpUtil.getString(Constant.userId)),
  303. "name": FlutterStars.SpUtil.getString("username"),
  304. "sessionid": id,
  305. "msg": msg,
  306. "dura": recordingDuration,
  307. };
  308. String text = json.encode(objs).toString();
  309. print(text);
  310. print(777);
  311. channel.sink.add(text);
  312. }
  313. void initLoop() {
  314. //定时10秒发送
  315. try {
  316. print("LOOP");
  317. var objs = {
  318. "cmd": "LOOP",
  319. "userId": int.parse(FlutterStars.SpUtil.getString(Constant.userId))
  320. };
  321. String text = json.encode(objs).toString();
  322. // print(text);
  323. // print(777);
  324. if (channel != null) {
  325. channel.sink?.add(text);
  326. }
  327. } catch (e) {
  328. print(e);
  329. }
  330. }
  331. void incomeRoom(id) {
  332. //进入房间
  333. roomId = id;
  334. // getOnlineUserEvent(roomId);
  335. // print(JsonEncoder().convert(roomId));
  336. // print(555);
  337. var objs = {
  338. "cmd": "INITROOM",
  339. "type": 1,
  340. "avatarUrl": FlutterStars.SpUtil.getString("avatarUrl"),
  341. "time": DateTime.now().millisecondsSinceEpoch,
  342. "fromUser": int.parse(FlutterStars.SpUtil.getString(Constant.userId)),
  343. "userId": int.parse(FlutterStars.SpUtil.getString(Constant.userId)),
  344. "name": FlutterStars.SpUtil.getString("username"),
  345. "sessionid": roomId,
  346. "msg": "进入房间"
  347. };
  348. String text = json.encode(objs).toString();
  349. // print(text);
  350. // print(777);
  351. channel.sink.add(text);
  352. }
  353. void incomeFriend(id) {
  354. //进入朋友房间
  355. roomId = id;
  356. // getOnlineUserEvent(roomId);
  357. }
  358. onError(error) {
  359. print('error------------>${error}');
  360. }
  361. void onDone() {
  362. print('websocket断开了');
  363. toasts("聊天室连接已断开!");
  364. cancelTimer();
  365. socketIsConnect = false;
  366. isSend = false;
  367. // closeWebSocket();
  368. // createWebsocket(roomId);
  369. // print('websocket重连');
  370. }
  371. void closeWebSocket() {
  372. //关闭链接
  373. if (channel != null) {
  374. channel.sink.close();
  375. }
  376. print('关闭了websocket');
  377. notifyListeners();
  378. }
  379. }