Files
2026-07-13 13:31:35 +08:00

4.6 KiB

Calculator HTTP Streaming Demo

This project demonstrates HTTP streaming using Server-Sent Events (SSE) with Spring Boot WebFlux. It consists of two applications:

  • Calculator Server: A reactive web service that performs calculations and streams results using SSE
  • Calculator Client: A client application that consumes the streaming endpoint

Prerequisites

  • Java 17 or higher
  • Maven 3.6 or higher

Project Structure

java/
├── calculator-server/     # Spring Boot server with SSE endpoint
│   ├── src/main/java/com/example/calculatorserver/
│   │   ├── CalculatorServerApplication.java
│   │   └── CalculatorController.java
│   └── pom.xml
├── calculator-client/     # Spring Boot client application
│   ├── src/main/java/com/example/calculatorclient/
│   │   └── CalculatorClientApplication.java
│   └── pom.xml
└── README.md

How It Works

  1. The Calculator Server exposes a /calculate endpoint that:

    • Accepts query parameters: a (number), b (number), op (operation)
    • Supported operations: add, sub, mul, div
    • Returns Server-Sent Events with calculation progress and result
  2. The Calculator Client connects to the server and:

    • Makes a request to calculate 7 * 5
    • Consumes the streaming response
    • Prints each event to the console

Running the Applications

1. Start the Calculator Server

Open a terminal and navigate to the server directory:

cd calculator-server
mvn clean package
mvn spring-boot:run

The server will start on http://localhost:8080

You should see output like:

Started CalculatorServerApplication in X.XXX seconds
Netty started on port 8080 (http)

2. Run the Calculator Client

Open a new terminal and navigate to the client directory:

cd calculator-client
mvn clean package
mvn spring-boot:run

The client will connect to the server, perform the calculation, and display the streaming results.

Option 2: Using Java directly

1. Compile and run the server:

cd calculator-server
mvn clean package
java -jar target/calculator-server-0.0.1-SNAPSHOT.jar

2. Compile and run the client:

cd calculator-client
mvn clean package
java -jar target/calculator-client-0.0.1-SNAPSHOT.jar

Testing the Server Manually

You can also test the server using a web browser or curl:

Using a web browser:

Visit: http://localhost:8080/calculate?a=10&b=5&op=add

Using curl:

curl "http://localhost:8080/calculate?a=10&b=5&op=add" -H "Accept: text/event-stream"

Expected Output

When running the client, you should see streaming output similar to:

event:info
data:Calculating: 7.0 mul 5.0

event:result
data:35.0

Supported Operations

  • add - Addition (a + b)
  • sub - Subtraction (a - b)
  • mul - Multiplication (a * b)
  • div - Division (a / b, returns NaN if b = 0)

API Reference

GET /calculate

Parameters:

  • a (required): First number (double)
  • b (required): Second number (double)
  • op (required): Operation (add, sub, mul, div)

Response:

  • Content-Type: text/event-stream
  • Returns Server-Sent Events with calculation progress and result

Example Request:

GET /calculate?a=7&b=5&op=mul HTTP/1.1
Host: localhost:8080
Accept: text/event-stream

Example Response:

event: info
data: Calculating: 7.0 mul 5.0

event: result
data: 35.0

Troubleshooting

Common Issues

  1. Port 8080 already in use

    • Stop any other applications using port 8080
    • Or change the server port in calculator-server/src/main/resources/application.yml
  2. Connection refused

    • Make sure the server is running before starting the client
    • Check that the server started successfully on port 8080
  3. Parameter name issues

    • This project includes Maven compiler configuration with -parameters flag
    • If you encounter parameter binding issues, ensure the project is built with this configuration

Stopping the Applications

  • Press Ctrl+C in the terminal where each application is running
  • Or use mvn spring-boot:stop if running as a background process

Technology Stack

  • Spring Boot 3.3.1 - Application framework
  • Spring WebFlux - Reactive web framework
  • Project Reactor - Reactive streams library
  • Netty - Non-blocking I/O server
  • Maven - Build tool
  • Java 17+ - Programming language

Next Steps

Try modifying the code to:

  • Add more mathematical operations
  • Include error handling for invalid operations
  • Add request/response logging
  • Implement authentication
  • Add unit tests