Single game instance "Host"

Godot Version

Question

I am trying to have a single Godot game instance act as a “Host” in that it is both a Server and Client. This way players can host network games with their friends without needing a dedicated server.

If I try to create a Server and a Client on the same game instance, it doesn’t seem to act as though the “host” client connects with the server. If instead I have a 2nd game instance be a client it then fires off “on connect” events properly.

I’m likely missing something simple, but how can I have a single game instance be a Host and not only a Server or only a Client?

Here’s my basic C# code thus far:

public partial class NetworkServer : Node
{
    const int PORT = 4444;
    
    public override void _Ready()
    {
        base._Ready();

        Multiplayer.PeerConnected += OnPeerConnected;
        Multiplayer.PeerDisconnected += OnPeerDisconnected;
        
        this.Name = "NetworkServer";
        
        var peer = new ENetMultiplayerPeer();
        var error = peer.CreateServer(PORT, 16);
        if (error != Error.Ok)
        {
            GD.Print("Error creating server: " + error);
            return;
        }
		
        peer.Host.Compress(ENetConnection.CompressionMode.RangeCoder);
		
        this.Multiplayer.MultiplayerPeer = peer;
    }
}
public partial class NetworkClient : Node
{
    const int PORT = 4444;
    private string _address = "localhost";
    
    public override void _Ready()
    {
        base._Ready();
        
        this.Name = "NetworkClient";
        
        var peer = new ENetMultiplayerPeer();
        var error = peer.CreateClient(_address, PORT);
        if (error != Error.Ok)
        {
            GD.Print("Error creating client: " + error);
            return;
        }
		
        peer.Host.Compress(ENetConnection.CompressionMode.RangeCoder);
        
        this.Multiplayer.MultiplayerPeer = peer;
        
    }
}
	public void CreateHost()
	{
		CreateServer();
		CreateClient("localhost");
	}
	
	public void CreateServer()
	{
		var server = _serverScene.Instantiate<NetworkServer>();
		GetTree().Root.AddChild(server);
		
		GD.Print("Create Server");
	}

	public void CreateClient(string address)
	{
		var client = _clientScene.Instantiate<NetworkClient>();
		GetTree().Root.AddChild(client);
		
		GD.Print("Create Client");
	}