Building a Robust Socket.IO Java Client: Design, Implementation, and Testing
This article walks through the design and implementation of a Java Socket.IO client library, covering dependency setup, core class architecture, event handling, connection management, performance testing utilities, and a complete usage demo with console output.
Overview
Leveraging prior experience with raw WebSocket, the author refactors a Socket.IO client in Java to simplify functional testing. The new client records additional event names, fixes bugs, and adds features for easier test integration.
Repository Links
Gitee: https://gitee.com/fanapi/tester
GitHub: https://github.com/JunManYuanLong/FunTester
Dependencies
Gradle:
compile group: 'io.socket', name: 'socket.io-client', version: '1.0.0'Maven:
<dependency>
<groupId>io.socket</groupId>
<artifactId>socket.io-client</artifactId>
<version>1.0.0</version>
</dependency>ScoketIOFunClient Class
The core class encapsulates a Socket.IO client with the following key components:
Static IO.Options options initialized via initOptions() to configure transports, reconnection attempts, delay, and timeout.
Static Vector<ScoketIOFunClient> clients to track all client instances.
Instance fields for client name ( cname), URL, underlying Socket, and a concurrent set events that records every listened event.
Important methods include: getInstance(String url, String cname) – creates a new client, sets its name, and returns it. init() – registers common event listeners (connecting, error, timeout, message) and logs each occurrence while adding the event name to events. connect() – initiates the socket connection, logs progress, and loops until the connection succeeds or exceeds the maximum retry count. addEventListener(String event, Emitter.Listener fn) – registers a custom listener and records the event. send(String event, Object... objects) – emits an event with arbitrary payloads and records the event name. close() – gracefully closes the socket. saveMsg(String msg) – stores recent messages up to a configured limit. closeAll() – iterates over all tracked clients, closes active sockets, clears the list, and logs the action.
Demo Application
A simple Java main class demonstrates usage:
package com.fun.ztest.java;
import com.alibaba.fastjson.JSON;
import com.fun.frame.SourceCode;
import com.fun.frame.socket.ScoketIOFunClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Tdd extends SourceCode {
private static Logger logger = LoggerFactory.getLogger(Tdd.class);
public static void main(String[] args) throws InterruptedException {
ScoketIOFunClient instance = ScoketIOFunClient.getInstance(
"http://ailearn-instruction-stress.xk12.cn:38899/?systemId=61951375269&loginType=3&token=4f99f5313c464070a40c709f72e8f72c&userType=1",
"DEFAULT_STRING");
instance.connect();
instance.addEventListener("my_response", objects -> {
String s = ScoketIOFunClient.initMsg(objects);
logger.info("{}收到my_response消息:{}", instance.getCname(), s);
});
String rege = "{\"cmd\": \"register\", \"userId\": 61951375269, \"role\": \"T\", \"deviceVersion\": \"1.0\", \"s_sid\": 123, \"token\": \"4f99f5313c464070a40c709f72e8f72c\"}";
instance.send("my_event", JSON.parseObject(rege));
String ss = "{\"cmd\": \"joinRoom\", \"roomId\": 8888}";
instance.send("my_event", JSON.parseObject(ss));
sleep(10);
instance.close();
}
}Console Output
INFO-> 当前用户:fv,IP:10.60.192.21,工作目录:/Users/fv/Documents/workspace/fun/,系统编码格式:UTF-8,系统Mac OS X版本:10.15.7
INFO-> FunTester 开始连接...
INFO-> FunTester 连接成功!
INFO-> FunTester收到my_response消息:[{"msg":"","code":0,"data":{"role":"T","s_sid":123,"deviceVersion":"1.0","userId":61951375269,"token":"4f99f5313c464070a40c709f72e8f72c"},"cmd":"registerResponse"}]
INFO-> FunTester收到my_response消息:[{"msg":"","code":0,"data":{"roomId":8888},"cmd":"joinRoomResponse"}]
INFO-> FunTester socket链接关闭!
Process finished with exit code 0Key Takeaways
The client provides a reusable, thread‑safe wrapper around Socket.IO with built‑in logging, event tracking, and simple configuration. It supports performance testing scenarios through cloning and custom client names, and the demo illustrates typical registration and room‑join workflows.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
