websocket copy.dart 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. import 'dart:convert';
  2. import 'package:flustars/flustars.dart' as FlutterStars;
  3. import 'package:flutter/foundation.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:liftmanager/common/common.dart';
  6. import 'package:liftmanager/utils/fast_notification.dart';
  7. import 'package:liftmanager/utils/log_util.dart';
  8. import 'package:liftmanager/utils/url.dart';
  9. import 'package:shared_preferences/shared_preferences.dart';
  10. import 'package:web_socket_channel/io.dart';
  11. class WebSocketProvide with ChangeNotifier{
  12. List<dynamic> historyMessageqqq = [];//接收到哦的所有的历史消息
  13. List<String> historyMessageString = [];//接收到哦的所有的历史消息
  14. var connecting = false;//websocket连接状态
  15. IOWebSocketChannel channel;
  16. String roomId;
  17. // DartNotificationCenter.subscribe(
  18. // channel: CHANNEL_NAME,
  19. // observer: i,
  20. // onNotification: (result) => print('received: $result'),
  21. // );
  22. // DartNotificationCenter.post(
  23. // channel: CHANNEL_NAME,
  24. // options: 'with options!!',
  25. // );
  26. void createWebsocket(roomIdss) async {//创建连接并且发送鉴别身份信息
  27. // print(JsonEncoder().convert(historyMessageString));
  28. // historyMessageString = [];
  29. // historyMessageqqq = [];
  30. roomId= roomId;
  31. print(666664);
  32. // FlutterStars.SpUtil.putObject("sessionIdObj", res);
  33. // SharedPreferences prefs = await SharedPreferences.getInstance();
  34. // if(prefs.get(roomIdss)==null){
  35. // prefs.setStringList(roomIdss, historyMessageString);
  36. // }else {
  37. // historyMessageString = prefs.getStringList(roomIdss);
  38. // }
  39. // print(JsonEncoder().convert(historyMessageqqq));
  40. // LogUtil.d(historyMessageString);
  41. // print(4444);
  42. channel = await new IOWebSocketChannel.connect(socketUrl);
  43. // channel = await new IOWebSocketChannel.connect('ws://192.168.0.110:8002/ws');
  44. // channel = await new IOWebSocketChannel.connect('ws://111.231.225.178:3001');
  45. var objs = {
  46. "cmd":"LOGINALL",
  47. "type":1,
  48. "avatarUrl":FlutterStars.SpUtil.getString("avatarUrl"),
  49. "time": DateTime.now().millisecondsSinceEpoch,
  50. "fromUser":FlutterStars.SpUtil.getString(Constant.userId),
  51. "name":FlutterStars.SpUtil.getString("username"),
  52. "sessionid":roomIdss,
  53. // "sessionid":roomId,
  54. "msg":"我是app端初始化"
  55. };
  56. String text = json.encode(objs).toString();
  57. channel.sink.add(text);
  58. //监听到服务器返回消息
  59. channel.stream.listen((data) => listenMessage(data),onError: onError,onDone: onDone);
  60. }
  61. void setStringEvent(id,strList)async{
  62. SharedPreferences prefs = await SharedPreferences.getInstance();
  63. prefs.setStringList(id, strList);
  64. LogUtil.d(prefs.getStringList(id));
  65. print(414141);
  66. }
  67. void setOnlineUserEvent(id,strOnlineList)async{
  68. SharedPreferences prefs = await SharedPreferences.getInstance();
  69. prefs.setStringList(id, strOnlineList);
  70. LogUtil.d(prefs.getStringList(id));
  71. print(414141);
  72. }
  73. void getOnlineUserEvent(id)async{
  74. SharedPreferences prefs = await SharedPreferences.getInstance();
  75. List<String>userStr = prefs.getStringList(id);
  76. List<dynamic>setUserList = userStr.map((item)=>jsonDecode(item)).toList();
  77. FastNotification.push("set_user",setUserList);
  78. LogUtil.d(prefs.getStringList(id));
  79. print(33333);
  80. }
  81. void getOnlineUserEventSystem(id)async{
  82. SharedPreferences prefs = await SharedPreferences.getInstance();
  83. List<String>userStr = prefs.getStringList(id);
  84. List<dynamic>setUserList = userStr.map((item)=>jsonDecode(item)).toList();
  85. FastNotification.push("set_user",setUserList);
  86. LogUtil.d(prefs.getStringList(id));
  87. print(33333);
  88. }
  89. void getStringEvent(obj,data)async{
  90. SharedPreferences prefs = await SharedPreferences.getInstance();
  91. // if(prefs.getStringList(roomId)==null){
  92. // prefs.setStringList(roomId, []);
  93. // }else {
  94. // historyMessageString = prefs.getStringList(roomId);
  95. // }
  96. historyMessageString = prefs.getStringList(roomId);
  97. LogUtil.d(historyMessageString);
  98. print(456741);
  99. // LogUtil.d(data);
  100. if(obj["cmd"] =="CHAT"){
  101. //正常消息
  102. historyMessageString.add(data.toString());
  103. setStringEvent(roomId,historyMessageString);
  104. }else if(obj["cmd"] =="UNREAD"){
  105. //离线消息
  106. Map<String,dynamic>msgObj = jsonDecode(obj["msg"]);
  107. // print(JsonEncoder().convert(historyMessageqqq));
  108. msgObj.forEach((key, value) {
  109. List<String>str = prefs.getStringList(key);
  110. List<String>strUserOnline = prefs.getStringList(key+"userOnline");
  111. value.forEach((item){
  112. if(jsonDecode(item)["msgList"].length>0){
  113. str.addAll(jsonDecode(item)["msgList"]);
  114. }
  115. if(jsonDecode(item)["flag"]){
  116. strUserOnline.addAll(item);
  117. }
  118. });
  119. setStringEvent(key,str);
  120. setOnlineUserEvent(key+"userOnline",strUserOnline);
  121. });
  122. LogUtil.d(msgObj);
  123. print(456456111);
  124. // msgList.forEach((item){
  125. // historyMessageString.add(jsonEncode(item));
  126. // });
  127. // setStringEvent();
  128. }else if(obj["cmd"] =="SYSTEM"){
  129. //系统消息
  130. List<dynamic>userList = jsonDecode(obj["msg"]);
  131. List<dynamic>setUserList=[];
  132. // LogUtil.d(userList);
  133. userList.forEach((item){
  134. // LogUtil.d(item.avatarUrl);
  135. // LogUtil.d(item["avatarUrl"]);
  136. var params = {
  137. "avatarUrl":item["avatarUrl"],
  138. "name":item["name"],
  139. "flag":item["flag"],
  140. };
  141. setUserList.add(params);
  142. });
  143. FastNotification.push("set_user",setUserList); //触发通知
  144. }
  145. print(222220);
  146. historyMessageqqq = historyMessageString.map((item)=>jsonDecode(item)).toList();
  147. FastNotification.push("chat_room",historyMessageqqq);
  148. }
  149. void listenMessage (data){
  150. connecting = true;
  151. var obj = jsonDecode(data);
  152. if(obj["sessionid"] != roomId){
  153. historyMessageString = [];
  154. historyMessageqqq = [];
  155. }
  156. getStringEvent(obj,data);
  157. print(222219);
  158. print(data);
  159. //触发通知
  160. notifyListeners();
  161. }
  162. void sendMessage(data,id){//发送消息
  163. roomId = id;
  164. print(JsonEncoder().convert(roomId));
  165. print(555);
  166. var objs = {
  167. "cmd":"CHAT",
  168. "type":1,
  169. "avatarUrl":FlutterStars.SpUtil.getString("avatarUrl"),
  170. "time": DateTime.now().millisecondsSinceEpoch,
  171. "fromUser":int.parse(FlutterStars.SpUtil.getString(Constant.userId)),
  172. "name":FlutterStars.SpUtil.getString("username"),
  173. "sessionid":id,
  174. "msg":data
  175. };
  176. String text = json.encode(objs).toString();
  177. print(text);
  178. print(777);
  179. channel.sink.add(text);
  180. }
  181. void incomeRoom(id){//进入房间
  182. roomId = id;
  183. getOnlineUserEvent(roomId);
  184. print(JsonEncoder().convert(roomId));
  185. print(555);
  186. var objs = {
  187. "cmd":"LOGIN",
  188. "type":1,
  189. "avatarUrl":FlutterStars.SpUtil.getString("avatarUrl"),
  190. "time": DateTime.now().millisecondsSinceEpoch,
  191. "fromUser":int.parse(FlutterStars.SpUtil.getString(Constant.userId)),
  192. "name":FlutterStars.SpUtil.getString("username"),
  193. "sessionid":roomId,
  194. "msg":"我首次进入房间"
  195. };
  196. String text = json.encode(objs).toString();
  197. print(text);
  198. print(777);
  199. channel.sink.add(text);
  200. }
  201. onError(error){
  202. print('error------------>${error}');
  203. }
  204. void onDone() {
  205. print('websocket断开了');
  206. // createWebsocket(roomId);
  207. print('websocket重连');
  208. }
  209. void closeWebSocket(){//关闭链接
  210. if(channel!=null){
  211. channel.sink.close();
  212. }
  213. print('关闭了websocket');
  214. notifyListeners();
  215. }
  216. }