server.gd 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. extends Node
  2. onready var _log_dest = get_parent().get_node("Panel/VBoxContainer/RichTextLabel")
  3. var _server = WebSocketServer.new()
  4. var _clients = {}
  5. var _write_mode = WebSocketPeer.WRITE_MODE_BINARY
  6. var _use_multiplayer = true
  7. var last_connected_client = 0
  8. func _init():
  9. _server.connect("client_connected", self, "_client_connected")
  10. _server.connect("client_disconnected", self, "_client_disconnected")
  11. _server.connect("client_close_request", self, "_client_close_request")
  12. _server.connect("data_received", self, "_client_receive")
  13. _server.connect("peer_packet", self, "_client_receive")
  14. _server.connect("peer_connected", self, "_client_connected", ["multiplayer_protocol"])
  15. _server.connect("peer_disconnected", self, "_client_disconnected")
  16. func _exit_tree():
  17. _clients.clear()
  18. _server.stop()
  19. func _process(_delta):
  20. if _server.is_listening():
  21. _server.poll()
  22. func _client_close_request(id, code, reason):
  23. print(reason == "Bye bye!")
  24. Utils._log(_log_dest, "Client %s close code: %d, reason: %s" % [id, code, reason])
  25. func _client_connected(id, protocol):
  26. _clients[id] = _server.get_peer(id)
  27. _clients[id].set_write_mode(_write_mode)
  28. last_connected_client = id
  29. Utils._log(_log_dest, "%s: Client connected with protocol %s" % [id, protocol])
  30. func _client_disconnected(id, clean = true):
  31. Utils._log(_log_dest, "Client %s disconnected. Was clean: %s" % [id, clean])
  32. if _clients.has(id):
  33. _clients.erase(id)
  34. func _client_receive(id):
  35. if _use_multiplayer:
  36. var peer_id = _server.get_packet_peer()
  37. var packet = _server.get_packet()
  38. Utils._log(_log_dest, "MPAPI: From %s data: %s" % [peer_id, Utils.decode_data(packet, false)])
  39. else:
  40. var packet = _server.get_peer(id).get_packet()
  41. var is_string = _server.get_peer(id).was_string_packet()
  42. Utils._log(_log_dest, "Data from %s BINARY: %s: %s" % [id, not is_string, Utils.decode_data(packet, is_string)])
  43. func send_data(data, dest):
  44. if _use_multiplayer:
  45. _server.set_target_peer(dest)
  46. _server.put_packet(Utils.encode_data(data, _write_mode))
  47. else:
  48. for id in _clients:
  49. _server.get_peer(id).put_packet(Utils.encode_data(data, _write_mode))
  50. func listen(port, supported_protocols, multiplayer):
  51. _use_multiplayer = multiplayer
  52. if _use_multiplayer:
  53. set_write_mode(WebSocketPeer.WRITE_MODE_BINARY)
  54. return _server.listen(port, supported_protocols, multiplayer)
  55. func stop():
  56. _server.stop()
  57. func set_write_mode(mode):
  58. _write_mode = mode
  59. for c in _clients:
  60. _clients[c].set_write_mode(_write_mode)