diff --git a/grpc/pom.xml b/grpc/pom.xml
new file mode 100644
index 0000000000..056db0c3fe
--- /dev/null
+++ b/grpc/pom.xml
@@ -0,0 +1,73 @@
+
+ 4.0.0
+
+ grpc
+ grpc-demo
+ 0.0.1-SNAPSHOT
+ jar
+
+ grpc-demo
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+ io.grpc
+ grpc-netty
+ 1.4.0
+
+
+ io.grpc
+ grpc-protobuf
+ 1.4.0
+
+
+ io.grpc
+ grpc-stub
+ 1.4.0
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
+
+
+ kr.motd.maven
+ os-maven-plugin
+ 1.5.0.Final
+
+
+
+
+ org.xolstice.maven.plugins
+ protobuf-maven-plugin
+ 0.5.0
+
+
+ com.google.protobuf:protoc:3.3.0:exe:${os.detected.classifier}
+
+ grpc-java
+
+ io.grpc:protoc-gen-grpc-java:1.4.0:exe:${os.detected.classifier}
+
+
+
+
+
+ compile
+ compile-custom
+
+
+
+
+
+
+
diff --git a/grpc/src/main/java/org/baeldung/grpc/client/GrpcClient.java b/grpc/src/main/java/org/baeldung/grpc/client/GrpcClient.java
new file mode 100644
index 0000000000..1a1809387f
--- /dev/null
+++ b/grpc/src/main/java/org/baeldung/grpc/client/GrpcClient.java
@@ -0,0 +1,28 @@
+package org.baeldung.grpc.client;
+
+import org.baeldung.grpc.HelloRequest;
+import org.baeldung.grpc.HelloResponse;
+import org.baeldung.grpc.HelloServiceGrpc;
+
+import io.grpc.ManagedChannel;
+import io.grpc.ManagedChannelBuilder;
+
+public class GrpcClient {
+ public static void main(String[] args) throws InterruptedException {
+ ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080)
+ .usePlaintext(true)
+ .build();
+
+ HelloServiceGrpc.HelloServiceBlockingStub stub
+ = HelloServiceGrpc.newBlockingStub(channel);
+
+ HelloResponse helloResponse = stub.hello(HelloRequest.newBuilder()
+ .setFirstName("Baeldung")
+ .setLastName("gRPC")
+ .build());
+
+ System.out.println("Response received from server:\n" + helloResponse);
+
+ channel.shutdown();
+ }
+}
diff --git a/grpc/src/main/java/org/baeldung/grpc/server/GrpcServer.java b/grpc/src/main/java/org/baeldung/grpc/server/GrpcServer.java
new file mode 100644
index 0000000000..9f119fe45d
--- /dev/null
+++ b/grpc/src/main/java/org/baeldung/grpc/server/GrpcServer.java
@@ -0,0 +1,19 @@
+package org.baeldung.grpc.server;
+
+import java.io.IOException;
+
+import io.grpc.Server;
+import io.grpc.ServerBuilder;
+
+public class GrpcServer
+{
+ public static void main(String[] args) throws IOException, InterruptedException {
+ Server server = ServerBuilder.forPort(8080)
+ .addService(new HelloServiceImpl()).build();
+
+ System.out.println("Starting server...");
+ server.start();
+ System.out.println("Server started!");
+ server.awaitTermination();
+ }
+}
diff --git a/grpc/src/main/java/org/baeldung/grpc/server/HelloServiceImpl.java b/grpc/src/main/java/org/baeldung/grpc/server/HelloServiceImpl.java
new file mode 100644
index 0000000000..b08ad02c97
--- /dev/null
+++ b/grpc/src/main/java/org/baeldung/grpc/server/HelloServiceImpl.java
@@ -0,0 +1,29 @@
+package org.baeldung.grpc.server;
+
+import org.baeldung.grpc.HelloRequest;
+import org.baeldung.grpc.HelloResponse;
+import org.baeldung.grpc.HelloServiceGrpc.HelloServiceImplBase;
+
+import io.grpc.stub.StreamObserver;
+
+public class HelloServiceImpl extends HelloServiceImplBase {
+
+ @Override
+ public void hello(
+ HelloRequest request, StreamObserver responseObserver) {
+ System.out.println("Request received from client:\n" + request);
+
+ String greeting = new StringBuilder().append("Hello, ")
+ .append(request.getFirstName())
+ .append(" ")
+ .append(request.getLastName())
+ .toString();
+
+ HelloResponse response = HelloResponse.newBuilder()
+ .setGreeting(greeting)
+ .build();
+
+ responseObserver.onNext(response);
+ responseObserver.onCompleted();
+ }
+}
diff --git a/grpc/src/main/proto/HelloService.proto b/grpc/src/main/proto/HelloService.proto
new file mode 100644
index 0000000000..4f53191ab9
--- /dev/null
+++ b/grpc/src/main/proto/HelloService.proto
@@ -0,0 +1,16 @@
+syntax = "proto3";
+option java_multiple_files = true;
+package org.baeldung.grpc;
+
+message HelloRequest {
+ string firstName = 1;
+ string lastName = 2;
+}
+
+message HelloResponse {
+ string greeting = 1;
+}
+
+service HelloService {
+ rpc hello(HelloRequest) returns (HelloResponse);
+}