> For the complete documentation index, see [llms.txt](https://eric-lo.gitbook.io/lab-grpc/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://eric-lo.gitbook.io/lab-grpc/implement-the-server-code.md).

# Implement the server code in Java

In this section, we will create our server program. We will

* Override the service base java class `CalculatorGrpc.CalculatorImplBase` generated from .proto. Implement the logic of the rpc methods (i.e **Sum** and **Product**).
* Running a gRPC server to handle the request from clients.

```bash
# Go to workspace
cd ~/grpclab

# Create directory src/main/cslab/grpclab
mkdir -p src/main/java/cslab/grpclab

#Create CalculatorServer.java in src/main/cslab/grpclab
nano src/main/java/cslab/grpclab/CalculatorServer.java
```

{% code title="CalculatorServer.java" %}

```java
package cslab.grpclab;

import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;

public class CalculatorServer {

    // Extend the base class `CalculatorGrpc.CalculatorImplBase` generated by gRPC protobuf compiler
    private static class CalculatorService extends CalculatorGrpc.CalculatorImplBase {

        //The logic of `sum`
        @Override
        public void sum(cslab.grpclab.CalculatorOuterClass.CalculationRequest request,
                        StreamObserver<cslab.grpclab.CalculatorOuterClass.CalculationRespond> responseObserver) {
            // Handle the request from client from `CalculationRequest` object
            float a = request.getA();
            float b = request.getB();

            // Construct `CalculationRespond` object
            CalculatorOuterClass.CalculationRespond respond = CalculatorOuterClass.CalculationRespond.newBuilder()
                    .setResult(a + b) //Set the value of result
                    .build();
            responseObserver.onNext(respond);

            responseObserver.onCompleted();
        }

        //The logic of `product`, just similar as 'sum'
        @Override
        public void product(cslab.grpclab.CalculatorOuterClass.CalculationRequest request,
                            StreamObserver<cslab.grpclab.CalculatorOuterClass.CalculationRespond> responseObserver) {
            float a = request.getA();
            float b = request.getB();

            CalculatorOuterClass.CalculationRespond respond = CalculatorOuterClass.CalculationRespond.newBuilder()
                    .setResult(a * b)
                    .build();
            responseObserver.onNext(respond);

            responseObserver.onCompleted();
        }
    }
    
    //Running a gRPC server to handle the request from clients.
    public static void main(String[] args) throws Exception {
        int tcpPort = 8980;

        //Create a instance CalculatorService
        CalculatorService service = new CalculatorService();

        //Create a instance of gRPC.Server
        final Server server = ServerBuilder.forPort(tcpPort)
                                        .addService(service) //Register your service
                                        .build();

        System.out.println("Start the grpc server.");
        server.start();

        //Stop the server
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                System.err.println("*** shutting down gRPC server since JVM is shutting down");
                server.shutdown();
                System.err.println("*** server shut down");
            }
        });

        server.awaitTermination();
    }
}
```

{% endcode %}

## Compile your program

Now you can try to compile your program into Java JAR.

```bash
mvn package
```

`grpclab-1-jar-with-dependencies.jar` will be generated under `target` which contains the bytecode of your program and dependency libraries. &#x20;

## Execute your CalculatorServer

You can launch a CalculatorServer by using command:

```
java -cp target/grpclab-1-jar-with-dependencies.jar cslab.grpclab.CalculatorServer 
```

You will see the following line is printed on the console:

```
Start the grpc server.
```

Press Ctrl+C to kill the gRPC server.
