websocket copy.dart 7.8 KB

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