Blockchain 5 min read

Using Web3j to Send Ethereum JSON‑RPC Requests via WebSocket

This article explains how to construct and send Ethereum JSON‑RPC calls such as net_version through a WebSocket connection using the Web3j Java library, including source code analysis, request construction, and a practical example with console output.

FunTester
FunTester
FunTester
Using Web3j to Send Ethereum JSON‑RPC Requests via WebSocket

Web3j Source Code

When first exploring Ethereum's Infura API, the author noticed a WebSocket option but could not locate comprehensive documentation, assuming HTTP was sufficient.

After deeper study of the JSON‑RPC protocol, it became clear that a request could be issued without a dedicated WebSocket API spec.

By examining the Web3j source code, the author pieced together the necessary request‑building logic. The following snippet shows the method used to obtain the network version:

public Request<?, NetVersion> netVersion() {
    return new Request("net_version", Collections.emptyList(), this.web3jService, NetVersion.class);
}

The org.web3j.protocol.core.Request constructor is defined as:

public Request(String method, List<S> params, Web3jService web3jService, Class<T> type) {
    this.method = method;
    this.params = params;
    this.id = nextId.getAndIncrement();
    this.web3jService = web3jService;
    this.responseType = type;
}

Sending a request over WebSocket simply involves transmitting a JSON‑RPC string that matches the fields of the Request object:

client.send("{\"jsonrpc\":\"2.0\",\"method\":\"net_version\",\"params\":[],\"id\":1333333}")

The author also notes the internal fields of Request, including a globally unique identifier generated with java.util.concurrent.atomic.AtomicLong:

private static AtomicLong nextId = new AtomicLong(0L);
private String jsonrpc = "2.0";
private String method;
private List<S> params;
private long id;
private Web3jService web3jService;
private Class<T> responseType;

WebSocket API Practice

Using a custom WebSocket client ( com.funtester.socket.WebSocketFunClient) connected to the Goerli test network, the author demonstrates a simple main method that sends two JSON‑RPC calls: eth_accounts and net_version.

static final String host = "wss://goerli.infura.io/ws/v3/apikey";

static void main(String[] args) {
    def client = new WebSocketFunClient(host, "infura ethereum");
    client.connect();
    client.send("{\"jsonrpc\":\"2.0\",\"method\":\"eth_accounts\",\"params\":[],\"id\":1}");
    client.send("{\"jsonrpc\":\"2.0\",\"method\":\"net_version\",\"params\":[],\"id\":1333333}");
}

The console output confirms successful connection and displays the JSON‑RPC responses:

22:03:44.299 WebSocketConnectReadThread-20 infura ethereum received: {"jsonrpc":"2.0","id":1,"result":[]}
22:03:44.544 WebSocketConnectReadThread-20 infura ethereum received: {"jsonrpc":"2.0","id":1333333,"result":"5"}
Additional links to original Chinese articles and collections are provided for further reading.
Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

JavaWebSocketBlockchainEthereumWeb3jJSON-RPC
FunTester
Written by

FunTester

10k followers, 1k articles | completely useless

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.