Emitting events
See also: https://socket.io/docs/v4/emitting-events/
Table of content
There are several ways to send events between the server and the client.
Basic emit
The Socket.IO API is inspired from the Node.js EventEmitter:
Server
io.on("connection", (socket) => {
socket.emit("hello", "world");
});
Client
socket.on("hello", new Emitter.Listener() {
@Override
public void call(Object... args) {
System.out.println(args[0]); // world
}
});
This also works in the other direction:
Server
io.on("connection", (socket) => {
socket.on("hello", (arg) => {
console.log(arg); // world
});
});
Client
socket.emit("hello", "world");
You can send any number of arguments, and all serializable datastructures are supported, including binary objects like Buffer or TypedArray.
Server
io.on("connection", (socket) => {
socket.on("hello", (...args) => {
console.log(args); // [ 1, '2', <Buffer 61 62 63>, { test: '42' } ]
});
});
Client
byte[] buffer = "abc".getBytes(StandardCharsets.UTF_8);
JSONObject object = new JSONObject();
object.put("test", "42");
socket.emit("hello", 1, "2", bytes, object);
Acknowledgements
Events are great, but in some cases you may want a more classic request-response API. In Socket.IO, this feature is named acknowledgements.
You can add a callback as the last argument of the emit(), and this callback will be called once the other side acknowledges the event:
From client to server
Client
// Java 7
socket.emit("update item", 1, new JSONObject(singletonMap("name", "updated")), new Ack() {
@Override
public void call(Object... args) {
JSONObject response = (JSONObject) args[0];
System.out.println(response.getString("status")); // "ok"
}
});
// Java 8 and above
socket.emit("update item", 1, new JSONObject(singletonMap("name", "updated")), (Ack) args -> {
JSONObject response = (JSONObject) args[0];
System.out.println(response.getString("status")); // "ok"
});
Server
io.on("connection", (socket) => {
socket.on("update item", (arg1, arg2, callback) => {
console.log(arg1); // 1
console.log(arg2); // { name: "updated" }
callback({
status: "ok"
});
});
});
From server to client
Server
io.on("connection", (socket) => {
socket.emit("hello", "please acknowledge", (response) => {
console.log(response); // prints "hi!"
});
});
Client
// Java 7
socket.on("hello", new Emitter.Listener() {
@Override
public void call(Object... args) {
System.out.println(args[0]); // "please acknowledge"
if (args.length > 1 && args[1] instanceof Ack) {
((Ack) args[1]).call("hi!");
}
}
});
// Java 8 and above
socket.on("hello", args -> {
System.out.println(args[0]); // "please acknowledge"
if (args.length > 1 && args[1] instanceof Ack) {
((Ack) args[1]).call("hi!");
}
});
With timeout
Starting with version 2.1.0, you can now assign a timeout to each emit:
socket.emit("hello", "world", new AckWithTimeout(5000) {
@Override
public void onTimeout() {
// ...
}
@Override
public void onSuccess(Object... args) {
// ...
}
});
