socket.dart 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import 'package:flutter/foundation.dart';
  2. import 'package:fluttertoast/fluttertoast.dart';
  3. import 'cache.dart';
  4. import 'dart:convert';
  5. import 'package:web_socket_channel/io.dart';
  6. import '../models/index.dart';
  7. import '../utils/events.dart';
  8. IOWebSocketChannel _channel;
  9. void onDone() {
  10. print("socket done");
  11. // Fluttertoast.showToast(msg: "服务器连接失败!请进入设置检查服务地址!");
  12. }
  13. void onError(event) {
  14. print("socket error: " + event.toString());
  15. }
  16. void onData(event) {
  17. var data = json.decode(event);
  18. var type = data["type"];
  19. print(data);
  20. switch (type) {
  21. case "pong":
  22. break;
  23. case "userOnline":
  24. Events.fire(UserOnline(UserInfo.fromJson(data["data"])));
  25. break;
  26. case "allUsers":
  27. Events.fire(UserList(data["data"]));
  28. break;
  29. case "message":
  30. var msg = Message.fromJson(data["data"]);
  31. var newMsg = HttpMessage();
  32. newMsg.id = msg.id;
  33. newMsg.mes_type = "visitor";
  34. newMsg.content = msg.content;
  35. newMsg.visitor_avator = msg.avator;
  36. newMsg.visitor_name = msg.name;
  37. Events.fire(UserMessage(newMsg));
  38. break;
  39. }
  40. }
  41. class Socket {
  42. static void connect () async {
  43. var host = Cache.get("server");
  44. var type = Cache.get("server_type") == "http://" ? "ws://" : "wss://";
  45. var server = type + host + "/chat_server";
  46. _channel = IOWebSocketChannel.connect(server, pingInterval: Duration(seconds: 10));
  47. _channel.stream.listen(onData, onDone: onDone, onError: onError);
  48. onOpen();
  49. }
  50. static void onOpen() {
  51. online();
  52. }
  53. static void online() {
  54. send({
  55. "type": "kfOnline",
  56. "data": json.decode(Cache.get("config"))
  57. });
  58. }
  59. static void ping() {
  60. send({
  61. "type": "ping",
  62. "data": ""
  63. });
  64. }
  65. static void send(Map<String, dynamic> data) {
  66. print("send $data");
  67. _channel?.sink?.add(json.encode(data));
  68. }
  69. static void close() {
  70. _channel?.sink?.close();
  71. }
  72. }