| name | fxgl-multiplayer |
| description | Add multiplayer and networking to an FXGL game — create TCP or WebSocket servers and clients via NetService, replicate entity spawns/positions/destruction across clients using MultiplayerService and NetworkComponent, synchronise player input, send and receive custom protocol messages, handle connect/disconnect events, and download files asynchronously. Use this skill when building a multiplayer game, a client-server architecture, a real-time entity sync system, or any network-connected feature in FXGL.
|
| triggers | ["multiplayer","network","NetService","MultiplayerService","NetworkComponent","TCP server","WebSocket","entity replication","server client","online game"] |
| compatibility | Java 17+, FXGL 21.x. Network requires open ports and matching client/server FXGL versions.
|
| category | fxgl/multiplayer |
| tags | ["fxgl","java","javafx","multiplayer"] |
| metadata | {"author":"fxgl-skills","version":"1.0","fxgl-version":"21.1"} |
| allowed-tools | ["Read","Write","Edit","Bash"] |
FXGL Multiplayer & Networking
Architecture
FXGL uses an authoritative server model:
- The server runs the game loop, processes input, and broadcasts world state.
- Clients send input events and render received state.
MultiplayerService handles entity spawn/destroy/position replication.
Setup
settings.addEngineService(MultiplayerService.class);
Server Side
Server<Bundle> server = getNetService().newTCPServer(55555);
server.setOnConnected(conn -> {
System.out.println("Client connected: " + conn.getConnectionNum());
getService(MultiplayerService.class).addEntityReplicationSender(server, conn);
});
server.setOnDisconnected(conn -> {
System.out.println("Client disconnected: " + conn.getConnectionNum());
});
server.setOnMessage((conn, bundle) -> {
String type = bundle.getString("type");
if ("input".equals(type)) {
String action = bundle.getString("action");
boolean active = bundle.getBoolean("active");
handleClientInput(conn.getConnectionNum(), action, active);
}
});
server.startAsync();
Client Side
Client<Bundle> client = getNetService().newTCPClient("localhost", 55555);
client.setOnConnected(conn -> {
System.out.println("Connected to server");
getService(MultiplayerService.class).addEntityReplicationReceiver(conn, getGameWorld());
});
client.setOnMessage((conn, bundle) -> {
});
{
();
bundle.put(, );
bundle.put(, actionName);
bundle.put(, isActive);
client.getConnection().send(bundle);
}
client.connectAsync();