godot-demo-projects/networking/websocket_minimal/server.gd

61 lines
2.3 KiB
GDScript3
Raw Normal View History

2019-07-28 14:13:19 +02:00
extends Node
# The port we will listen to.
2019-07-28 14:13:19 +02:00
const PORT = 9080
# Our WebSocketServer instance.
2019-07-28 14:13:19 +02:00
var _server = WebSocketServer.new()
func _ready():
# Connect base signals to get notified of new client connections,
# disconnections, and disconnect requests.
_server.client_connected.connect(self._connected)
_server.client_disconnected.connect(self._disconnected)
_server.client_close_request.connect(self._close_request)
2019-07-28 14:13:19 +02:00
# This signal is emitted when not using the Multiplayer API every time a
# full packet is received.
# Alternatively, you could check get_peer(PEER_ID).get_available_packets()
# in a loop for each connected peer.
_server.data_received.connect(self._on_data)
2019-07-28 14:13:19 +02:00
# Start listening on the given port.
var err = _server.listen(PORT)
if err != OK:
push_error("Unable to start server.")
2019-07-28 14:13:19 +02:00
set_process(false)
func _connected(id, proto, rname):
2019-07-28 14:13:19 +02:00
# This is called when a new peer connects, "id" will be the assigned peer id,
# "proto" will be the selected WebSocket sub-protocol (which is optional)
print_rich("Client [b]%d[/b] [color=green]connected[/color] with protocol [b]%s[/b] and resource name [b]%s[/b]" % [id, proto, rname])
2019-07-28 14:13:19 +02:00
2019-07-28 14:13:19 +02:00
func _close_request(id, code, reason):
# This is called when a client notifies that it wishes to close the connection,
# providing a reason string and close code.
print_rich("Client [b]%d[/b] [color=yellow]disconnecting[/color] with code: [b]%d[/b], reason: [b]%s[/b]" % [id, code, reason])
2019-07-28 14:13:19 +02:00
2019-07-28 14:13:19 +02:00
func _disconnected(id, was_clean = false):
# This is called when a client disconnects, "id" will be the one of the
# disconnecting client, "was_clean" will tell you if the disconnection
# was correctly notified by the remote peer before closing the socket.
print_rich("Client [b]%d[/b] [color=red]disconnected[/color], clean: [b]%s[/b]" % [id, str(was_clean)])
2019-07-28 14:13:19 +02:00
2019-07-28 14:13:19 +02:00
func _on_data(id):
# Print the received packet, you MUST always use get_peer(id).get_packet to receive data,
# and not get_packet directly when not using the MultiplayerAPI.
var pkt = _server.get_peer(id).get_packet()
print("Got data from client [b]%d[/b]: [b]%s[/b] ... echoing" % [id, pkt.get_string_from_utf8()])
2019-07-28 14:13:19 +02:00
_server.get_peer(id).put_packet(pkt)
func _process(_delta):
2019-07-28 14:13:19 +02:00
# Call this in _process or _physics_process.
# Data transfer, and signals emission will only happen when calling this function.
_server.poll()
2019-07-28 14:13:19 +02:00
func _exit_tree():
_server.stop()